【发布时间】: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