2017-09-22 3 views
0

Warum blockiert es? Ich kenne eine Lösung mit Dispatcher.PushFrame() aber trotzdem. Ist es das Problem eines klassischen Typs "Nicht auf Async-Code blockieren"?Warum wartet dispatcher.Invoke?

UPD: Jetzt wartet es synchron auf den Hauptthread und verwendet threadpool Dispatcher und Still-Blöcke.

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

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

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

+2

'Test() Warten();.' Blockiert nicht 'await' –

+0

seit' Warte() 'wartet nicht auf eine Aufgabe, die auf Hintergrundthread ausgeführt wird. Wenn' 'warten' 'passiert ist, wird der Hauptthread blockiert, und so ist jeder Eintrag blockiert. – John

Antwort

2

Ich versuche diesen Code, und es funktioniert. Das Problem ist, wie Dispatche arbeiten, ich denke, es braucht einen Thread, der nicht gestoppt und nicht ausgesetzt ist und nicht für andere Code ausgeführt.

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

Ja, danke das wird funktionieren, wir haben eine Lösung basierend auf PushFrame. Ich wollte nur wissen, warum warten nicht funktioniert. –

+0

'await' funktioniert nicht, denn wenn du' wartest', muss der aktuelle Thread "pausieren" und diesen Thread zum threadpool freigeben (nicht immer passiert, nur passiert, wenn er den Thread wechselt, und das tut er für In diesem Fall: 'Task.Run'), was dazu führen kann, dass der Dispatcher nicht ausgeführt werden kann, und weil die hazard-Methode niemals enden wird. – John

Verwandte Themen