2013-08-05 24 views
20

ho il seguente codice quiOttenere valore restituito da Task.Run

public static async Task<string> Start(IProgress<ProcessTaskAsyncExProgress> progress) 
    { 
     const int total = 10; 
     for (var i = 0; i <= total; i++) 
     { 
      await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture))); 
      if (progress != null) 
      { 
       var args = new ProcessTaskAsyncExProgress 
       { 
        ProgressPercentage = (int)(i/(double)total * 100.0), 
        Text = "processing " + i 
       }; 
       progress.Report(args); 
      } 
     } 
     return "Done"; 
    } 

    private static string RunLongTask(string taskName) 
    { 
     Task.Delay(300); 
     return taskName + "Completed!"; 
    } 

In questa linea:

await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture))); 

Come faccio ad avere indietro il valore stringa di RunLongTask?

Ho provato

var val = await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture))).Result; 

Ma ottengo un errore "stringa non è awaitable"

risposta

51

Rimuovere il Result dalla fine. Quando si await si ottiene il Result indietro dal metodo di attesa.

var val = await Task.Run(() => RunLongTask(i.ToString(CultureInfo.InvariantCulture))); 
5

Questa non è una risposta diretta alla vecchia questione, ma per gli altri la ricerca:

"Normalmente" non si dovrebbe fare questo, ma a volte è necessario abbinare un'API libreria in modo da poter utilizzare una funzione wrapper come di seguito:

private async Task<string> WrapSomeMethod(string someParam) 
{ 
    //adding .ConfigureAwait(false) may NOT be what you want but google it. 
    return await Task.Run(() => SomeObj.SomeMethodAsync(someParam)).ConfigureAwait(false); 
} 

E poi chiamare che invece con .Result come di seguito:

string blah = WrapSomeMethod(someParam).Result;