我正在开发一个使用Xamarin开发的移动应用程序,我不时地收到报告,其中应用程序因以下异常而崩溃:
System.InvalidOperationException可能无法在已完成的任务上调用Start。
为了清楚起见,这或多或少是函数的结构:
CancellationTokenSource tokenSource;
void Function(bool condition1, bool condition2)
{
if (tokenSource != null)
{
tokenSource.Cancel();
tokenSource.Dispose();
tokenSource = null;
}
Task completionTask = null;
if (condition1)
{
tokenSource = new CancellationTokenSource();
completionTask = new Task(async () =>
{
await Task.Delay(1000);
if (tokenSource != null && !tokenSource.IsCancellationRequested)
{
InvokeOnMainThread(Function2);
}
}, tokenSource.Token);
}
if (condition2)
{
TaskFactory.StartNew(() =>
{
...
}).ContinueWith(() =>
{
if (completionTask != null)
{
completionTask.Start();
}
});
}
else
{
if (completionTask != null)
{
completionTask.Start();
}
}
}
void Function2()
{
if (tokenSource != null)
{
tokenSource.Cancel();
tokenSource.Dispose();
tokenSource = null;
}
}
我无法重现错误,而且我也不确定completionTask
是如何启动的,因为它只能启动一次。即使由于任何原因Function
按顺序调用,或由多个线程调用,这也不会导致任何问题,因为completionTask
是一个局部变量。
关于可能是什么原因的任何想法?
答案 0 :(得分:0)
我认为这是cancelToken上的竞争条件,因为它跨越多个函数调用。 因此,您可以尝试启动由function2取消的任务或另一个对同一函数的调用。