【问题标题】:C# async method called twiceC# 异步方法调用了两次
【发布时间】:2023-04-07 06:25:02
【问题描述】:

我正在使用 c# 和 Xamarin 构建一个 Android 应用程序。
我有一个创建倒数计时器的方法,并且为了不阻塞 UI,该方法是异步的。 倒计时完成后,该方法调用另一个方法,向服务器发送一些东西。如果服务器响应为“true”,则第二个方法调用第三个方法,这也是一个异步方法。
问题是第三种方法被调用了两次,然后我看到有 2 个任务在后台运行。

第一种方法(倒计时):

public async Task RunTimerToScheduledTime(DateTime dt)
    {         
        while (savedInstanceState == SavedInstanceState.OnScheduled && dt > DateTime.Now)
        {
            var sub = dt - DateTime.Now;
            RunOnUiThread(() => ScheduledCuontdownTv.Text = string.Format("{0:hh\\:mm\\:ss}", sub));
            await Task.Delay(1000);

            if(Convert.ToInt32(sub.TotalSeconds) == 60)
            {
                Log.Debug("WNS", "RunTimerToScheduledTime - 60 sec left");
            }

            if (Convert.ToInt32(sub.TotalSeconds) == 5)
            {
                Log.Debug("WNS", "RunTimerToScheduledTime - 5 sec left");
            }
        }
        await ScheduledRideIsDone();
}

第二种方法(向服务器发送东西的方法):

 public async Task ScheduledRideIsDone()
    {
        MakeLoadingLayout();
        try
        {
            var res = await Api.UpdateScheduledRideStatus(SoluVars.Me.IdString, SceheduledRideStatus.Done);
            if (!res)
            {
                GlobalMethods.ShortAlertDialog(this, "bla", "bla");
                return;
            }
            else
            {
                await MakeActive();
            }
        }
        catch (Exception ex)
        {
            Log.Debug("WNS", ex.Message);
            GlobalMethods.ShortAlertDialog(this, "bla", "bla");
        }
    }

第三种方法(被调用两次的方法):

  public async Task MakeActive()
    {
        loadingActive.Show();
        try
        {

            var res = await Api.Transofrm(id, currentLocationCoords);
            if (res)
            {

                /// Some long tasks


                //Task that should run in the background from now on
                await Task.WhenAll(AskForCurrentCityLocation(), UpdateActiveDriverTimeStamp(), UpdateWaitingCustomerAdapter());  
            }
        }
        catch (Exception ex)
        {
            Log.Debug("WNS", ex.InnerException.ToString());
        }
    }

这里有什么问题?谢谢!

【问题讨论】:

  • 谁调用这些方法?
  • 您发布的代码甚至没有调用一次MakeMeAnActiveDriver() 方法。请阅读minimal reproducible example,以便您了解作为一个有用的、编写良好的 Stack Overflow 问题的一部分需要什么样的代码。另请参阅How to Ask,包括该页面底部链接的所有文章,以获取有关如何以清晰、可回答的方式提出问题的更多建议。
  • 我编辑了代码,对不起。代码较长,我删除了一些不重要的行并更改了名称以使其更清晰。 @John Ephraim Tugado 正如我在问题中解释的第一种方法调用第二种方法,第二种方法调用第三种方法。问题是第三种方法运行了两次。

标签: c# android asynchronous xamarin xamarin.android


【解决方案1】:

在方法中放置一个断点,然后查看第二次调用它的调用堆栈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    相关资源
    最近更新 更多