2016-03-21 10 views
5

Ich benutze MvvmCross und die AsyncEx Bibliothek innerhalb einer Windows 10 (UWP) App.C# blockierender Code in async Methode

In einem Ansichtsmodell, ich habe eine INotifyTaskCompletion Eigenschaft (1), die zu einer Async-Methode in dem Ansichtsmodell (2) verkabelt-up ist

In (2), I-Aufruf eines Async Bibliotheksverfahren, die:

  • Checks ein lokaler Cache
  • Downloads Daten asynchron
  • Fügt die Daten in den Cache

Der Caching-Code kann nicht asynchron erstellt werden. Daher enthält die Bibliotheksmethode sowohl blockierenden als auch asynchronen Code.

Q. Was ist der beste Weg, um das Blockieren des UI-Threads zu verhindern?

Ich verstehe von Stephen Cleary, nicht in asynchronen Code zu blockieren und Task.Run nicht in Bibliotheksmethoden zu verwenden. Also muss ich ...

Verschieben Sie die Caching-Aufrufe in (2) z.

  • Verwendung Task.Run (der Cache prüfen)
  • Anruf die Bibliothek erneut Verfahren asynchron
  • Verwenden Task.Run (die Daten an Cache)?

Gibt es einen besseren Weg?

+1

Haben Sie etwas Code, den Sie teilen könnten? –

+0

Hängt von Ihrer Definition von "besser" ab. Wenn Sie den Cache-Code nicht ändern können und async/await verwenden möchten, ist die Verwendung von 'Task.Run()' für den Caching-Code "korrekt". – Jcl

Antwort

3

Wenn Sie vollständig synchronen Code haben, den Sie nicht ändern können, um es erwartungsvoll zurückgeben zu lassen und asynchron zu machen, dann ist Ihre einzige Wahl, wenn Sie async/await verwenden möchten, Task.Run() zu verwenden.

Etwas wie:

public async Task<T> MyMethod() 
{ 
    T result = await Task.Run(() => CheckCacheOnSyncMethodICantChange()); 
    if(result != null) 
    { 
    result = await MyLibraryMethodThatReturnsATask(); 
    await Task.Run(() => AddToCacheOnSyncMethodICantChange(result)); 
    } 
    return result; 
} 

ok sein sollte.

+0

Danke. Ich werde deine Antwort als richtig markieren. – Howard

+0

Trotz meiner Antwort und für Ihren speziellen Fall sollte ein Cache schnell sein (das ist der Grund, warum Sie ihn verwenden) ... Sind Sie sicher, dass Sie die Cache-Methoden asynchron machen müssen? – Jcl

+1

Ich verwende SQLite.net, um die Daten in einer dateibasierten Datenbank zwischenzuspeichern. Da diese Arbeit nicht an die CPU gebunden ist, möchte ich dies tun, ohne den UI-Thread zu blockieren. Habe ich etwas verpasst? – Howard