2017-09-22 17 views
0

なぜブロックされますか?私はDispatcher.PushFrame()で解決策を知っていますが、それでもなお解決策はあります。従来の「非同期コードでブロックしない」タイプの問題ですか?Dispatcher.Invokeをブロックするのはなぜですか?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Test().Wait(); 
    } 

    static async Task Test() 
    { 
     var disp = Dispatcher.CurrentDispatcher; 
     var t = Task.Run(() => 
     { 
      disp.Invoke(() => 
      { 
       Console.WriteLine("works"); 
      }); 
     }); 
     await t.ConfigureAwait(false); 
    } 
} 

UPD:メインスレッドで同期して待機し、スレッドプールディスパッチャーとスティルブロックを使用します。

+0

https://stackoverflow.com/questions/13140523/await-vs-task-wait-deadlock – Legends

+2

'テスト())(WAIT;' 'await' –

+0

しないブロックされている'待機ため() 'はバックグラウンドスレッド上で実行されるタスクを待たないので、' await 'が起こったとき、メインスレッドがブロックされ、すべてのスレッドがブロックされるようにする。 – John

答えて

2

私はこのコードを試しています。問題はどのようにDispatcheの仕事です、私はそれが停止していないとスリープされていないと他のコードを実行するためのビジーではないスレッドが必要と思うです。 。

static Dispatcher dispatcher; 
static void Main(string[] args) 
{ 
    dispatcher = Dispatcher.CurrentDispatcher; 
    Task.Run(async() => await Test()); //.Wait(); 

    while (true) 
    { 
     Dispatcher.PushFrame(new DispatcherFrame()); 
    } 
} 

static async Task Test() 
{ 
    //var dispatcher = Dispatcher.CurrentDispatcher; 
    var t = Task.Run(() => 
    { 
     Console.WriteLine(dispatcher.Thread.ThreadState); 
     dispatcher.Invoke(() => 
     { 
      Console.WriteLine("works"); 
     }); 
    }); 
    await t; ; 
} 
+0

はい、ありがとうございます、我々はPushFrameに基づくソリューションを持っています。待っているのはなぜうまくいかないのかを知りたかっただけです。 –

+0

'await'は' await'を実行すると動作している現在のスレッドが "一時停止"してこのスレッドをスレッドプールに解放する必要があるため、動作しません(スレッドごとに発生しません。この場合: 'Task.Run')、ディスパッチャを実行できなくなり、awaitメソッドが決して終了しないためです。 – John

関連する問題