我有一个应用,其中有不同的后台定时器正在与API进行同步。
然而,在实际同步之前,它们都会先ping API,看它们是否可以继续。为了避免多次调用,如果已经有相同的Task
在运行,我让它们等待该Task
。当Task
返回结果后,等待的进程应该得到结果。同时,如果调用了CanExecute
方法且Task
未在运行,则应重新运行Task
。
protected async Task<bool> CanExecute([CallerMemberName] string memberName = "")
{
lock (_lockobj)
{
if (_runningTask == null)
{
_runningTask = CanExecuteTask(memberName);
}
}
var result = await _runningTask;
_runningTask = null;
return result;
}
private async Task<bool> CanExecuteTask(string callingMemberName)
{
var result = // do http call and some other method calls
return result;
}
我不确定问题出在哪里,但我认为会发生死锁并且同步没有继续进行。如何正确解决这个问题?
CanExecute
吗?如果不需要,你可以在构造函数中调用_runningTask = CanExecuteTask
并在方法中使用await
。该任务仅启动一次,但每个线程都将等待直到任务完成。 - Panagiotis KanavosTask
已经完成,它会重新运行吗? - Expressingxawait
等待一个已经处于活动状态的任务,它不会导致任务开始。任务不是线程或函数。它们代表了一种“承诺”,即某些事情可能会在未来完成并产生一个值。在构造函数中启动任务并将其存储在字段中是一个常见的习惯用法。 - Panagiotis Kanavos