C# Xamarin - 如何延迟第二个 void

Posted

技术标签:

【中文标题】C# Xamarin - 如何延迟第二个 void【英文标题】:C# Xamarin - How to delay second void 【发布时间】:2021-11-27 22:13:39 【问题描述】:

我尝试了许多教程,但没有找到可行的解决方案。 所以我想用 3x voids 开始我的应用程序。第一个 void 是 Popup,它实现了 Timer 并在 5 秒后消失。然后我有第二个计时器,它应该在第一个计时器之后启动。所以我决定将我的第二次无效延迟 5 秒,或者有没有其他方法可以解决它?

我的第一个计时器是来自不同 xaml 页面的弹出窗口。

无论如何,我有一个计时器可以立即随应用程序启动,我希望第二个计时器在第一个计时器结束后启动。我该如何实现呢?

这是我的代码:

public quick_math()
        
            InitializeComponent();
            NavigationPage.SetHasNavigationBar(this, false);
            ReadyCheck(); // this is 1st Timer (5 seconds)
            Execute(); // this is my program (not needed to add code of this)
            Timer_02(); // second timer (should start after 1st one with delay 5 sec)

        


public void ReadyCheck()
        
            Navigation.ShowPopup(new Game_Assets.ReadyCheck_popup()
            
                IsLightDismissEnabled = false

            ) ;

        
        
public void Timer_02()
        
            NavigationPage.SetHasNavigationBar(this, false);
            BindingContext = this;
            Minimum = 0;
            Maximum = 45;
            ProgressValue = 45;
            timerRunning = true;
            time.Start();
            Device.StartTimer(TimeSpan.FromSeconds(1), () =>
            
                if (ProgressValue > Minimum)
                
                    ProgressValue--;
                    return true;
                
                else if (ProgressValue == Minimum)
                
                    time.Stop();
                    timerRunning = false;
                    //PerformOperationHere logic operation here.
                    return false;
                
                else
                
                    return true;
                
            );
        

任何知识都会对我有用,我很感激。

@编辑 (我知道这不是最好的主意,但目前有效)


public async Task ReadyCheck() // timer 5 sec
        
            int before = 0;
            if(before == 0)
            
                Navigation.ShowPopup(new Game_Assets.ReadyCheck_popup()
                
                    IsLightDismissEnabled = false

                );
                before++;
                if(before != 0)
                
                    await Task.Delay(5000); // delay for second timer
                    Timer_02(); 
                    Execute();
                
            
        

【问题讨论】:

你可以让你的函数async和使用ContinueWith() 它真的对我不起作用,或者我做错了什么。有什么帮助吗?有任何想法吗?我今天花了大约 5 个小时阅读 await + async,但仍然没有找到解决我的问题的方法。 好的,我会用一个例子发布一个答案。 【参考方案1】:

为此,请使用asyncContinueWith()

Class "Functions"

public async Task Function1()

   //do something


public async Task Function2()

   //do something


public async Task Function3()

   //do something


Class "Main"

public async void CallTheFunctionsInOrder()

 Functions func = new Functions();
 func.Function1().ContinueWith(antecedent => func.Function2()).ContinueWith(antecedent => func.Function3());   

你的函数实际上不需要异步,它可以是同步的,但是async 让你使用ContinueWith()。使用这种方式:

您的Function1() 将处理。 当你的Function1()结束时,它会继续Function2(),但是,你的Function1()需要结束,这就是它调用antecedent的原因。 Function3() 的处理相同。

【讨论】:

有了这个我有“编译器错误 CS0023”。我不能使用运算符“。”无效类型。 Function1().ContinueWith - 对于 void 类型,您不能使用运算符“.” 操作,我的错,我很困惑。我编辑了我的问题。它是 Task 而不是 void。你的调用函数的类可以是void, Task, bool,不管怎样。 这些功能不适用于我的程序。他们正在破坏我的整个程序,但我确信我将来会使用它,所以感谢您的时间和帮助。此刻,我编辑了我的问题,以便您了解我做了什么(我知道这不是一个好主意 xd)。

以上是关于C# Xamarin - 如何延迟第二个 void的主要内容,如果未能解决你的问题,请参考以下文章

c#开发移动APP-Xamarin入门扩展

如何加载存在于 Xamarin.iOS 中的共享库项目中的第二个 Storyboard

c#开发移动APP-Xamarin入门扩展

c# 延迟评估和返回值

如何在 xamarin ios 中从一个视图控制器导航到第二个视图控制器?

c#开发移动APP-Xamarin入门扩展剖析