7

私は以下のような仕事をしています。

var task = Task<string>.Factory.StartNew(() => longrunningmethod()
    .ContinueWith(a =>
             longrunningmethodcompleted((Task<string>)a,
                  TaskScheduler.FromCurrentSynchronizationContext())));

task.Wait();

私のタスクは longrunningmethod を呼び出し、完了後に completed メソッドを呼び出します。私の longrunningmethod の中で、私は だけ遅れていThread.Sleep(30000)ます。Task.wait システムを使用するとハングし、longrunningmethodcompleted メソッドを呼び出していません。Task.wait を使用しないと、すべてがうまく流れます。

4

3 に答える 3

0

実際の非同期アクションが何であるかを確認せずに、コードの何が問題なのかを判断するのは困難です。私が知っているのは、MSDN によると、タスクが完了するのを待つことだけです。現在の SynchronizationContext を使用しようとしているために、アクションがブロックされる可能性はありますか?

私が尋ねている理由はあなただからです

  1. タスクを開始する
  2. タスクが完了するのを待ちます (これはタスクの続行です)
  3. タスクは現在の SynchronizationContext で続行しようとします
  4. タスクはメイン スレッドの取得を試みます
  5. 待機が完了した後にスレッドを取るようにスケジュールされたタスク
  6. しかし、待機は現在のタスクが完了するのを待っています (デッドロック)



私が言いたいのは、あなたのプログラムが動作する理由は、Thread.Sleep(seconds)制限時間が過ぎてもスレッドが続行されるからです。

于 2013-07-05T13:54:57.563 に答える