私は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
はローカル変数であるため、問題はありません。
何が原因か考えてみましょうか?
タスクが完了したかどうかを確認するプロパティまたはメソッドがあります。 https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.completedtask(v=vs.110).aspx –
条件1と条件2の両方が真の場合、試してみることができるように見えます完了Taskを2回開始します。 – user6144226
さて、一般的なコンセンサスとして、[タスクコンストラクタは使用しないでください](http://blog.stephencleary.com/2014/05/a-tour-of-task-part-1-constructors.html) 。 –