C#异步方法调用两次

时间:2017-10-23 01:42:54

标签: c# android asynchronous xamarin xamarin.android

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

第一种方法(倒数计时器):

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());
        }
    }

这是什么问题?谢谢!

1 个答案:

答案 0 :(得分:0)

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