【问题标题】:C# Xamarin - How to delay second voidC# Xamarin - 如何延迟第二个 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,但仍然没有找到解决我的问题的方法。
  • 好的,我会用一个例子发布一个答案。

标签: c# xamarin xamarin.forms async-await xamarin.android


【解决方案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)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-01
  • 2011-09-16
相关资源
最近更新 更多