2017-08-04 3 views
1

den folgenden Code-Schnipsel Betrachten in dem die MyMethod und seine asynchrone Version MyMethodAsync auf unterschiedliche Weise aufgerufen:Warum auf Asynchron-Funktion Task.Run Verwendung nicht zurück Aufgabe <Task<T>>

using System; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static int MyMethod() 
     { 
      System.Threading.Thread.Sleep(1000); 

      return 42; 
     } 

     static async Task<int> MyMethodAsync() 
     { 
      await Task.Delay(1000); 

      return 42; 
     } 

     static void Main(string[] args) 
     { 
      var result1 = MyMethod(); // int 
      var result2 = MyMethodAsync(); // Task<int> 
      var result3 = Task.Run(() => MyMethod()); // Task<int> 
      var result4 = Task.Run(() => MyMethodAsync()); // Task<int> 
     } 
    } 
} 

In jedem Fall I habe den Rückgabetyp kommentiert.

Die Frage ist, warum der Typ von result4 ist zu? Sollte es nicht Task<Task<int>> sein?

BTW, gibt es einen Fall, dass der Aufruf einer asynchronen Methode von Task.Run von Vorteil sein könnte?

Antwort

1

Der Grund ist es eine Task<int> zurückgibt, ist, dass Sie die Task.Run(Func<Task<TResult>>) Überlastung anrufen, die eine Aufgabe gibt, die für die Aufgabe zurückgegeben, indem Sie Ihre Funktion als Proxy dient. Wenn Sie die ursprüngliche Überlastung verwenden möchten, können Sie den generischen Typ-Parameter angeben:

Was Ihre zweite Frage: Task.Run auf einem asynchronen Betrieb unter Verwendung von Vorteil ist, wenn die genannte Operation auch einen synchronen Teil hat, die dadurch wird auf einem Hintergrund-Thread ausgeführt, anstatt den ursprünglichen Thread zu blockieren. Beispiel: StreamWriter.WriteAsync muss möglicherweise die Zeichenfolge in ein Byte-Array serialisieren, bevor Sie sie asynchron auf die Festplatte schreiben. Die Serialisierung erfolgt synchron und könnte von einem Hintergrund-Thread profitieren.

Verwandte Themen