Я работаю над мобильным приложением, разработанным с помощью 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
является локальной переменной.
Любая идея о том, что может быть причиной?