2016-06-01 13 views
1

私は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

タスクが完了したかどうかを確認するプロパティまたはメソッドがあります。 https://msdn.microsoft.com/en-us/library/system.threading.tasks.task.completedtask(v=vs.110).aspx –

+0

条件1と条件2の両方が真の場合、試してみることができるように見えます完了Taskを2回開始します。 – user6144226

+1

さて、一般的なコンセンサスとして、[タスクコンストラクタは使用しないでください](http://blog.stephencleary.com/2014/05/a-tour-of-task-part-1-constructors.html) 。 –

答えて

0

これは、複数の関数呼び出しでスコープされているため、cancelationTokenの競合状態だと思います。 したがって、function2によって取り消されたタスク、または同じ関数への別の呼び出しによって開始されるタスクを試行できます。

+0

こんにちは、このような問題の原因となる一連のイベントを提供できますか? – markusian

+0

私は関数をループで10回だけ実行します。奇妙なことに、私はFiddleでこれを再現できませんでした:https://dotnetfiddle.net/Widget/2sstvm – user6144226

+0

@markusian私は実際にあなたがどこでもこれらの仕事を待っていないことがかなり気になっています。 – user6144226

関連する問題