2012-09-13 135 views
22

在C#/ XAML中的Windows 8應用程序中,我有時想從非異步方法調用awaitable方法。是否可以在非異步方法中調用awaitable方法?

其實是正確的,以取代本:

public async Task<string> MyCallingMethod() 
    { 
     string result = await myMethodAsync(); 
     return result; 
    } 

本:

public string MyCallingMethod() 
    { 
     Task.Run(async() => { 
      string result = await myMethodAsync(); 
      return result; 
      }); 
    } 

優點對我來說,我可以用MyCallingMethod無需等待,但是這是正確的? 如果我想傳遞MyCallingMethod的ref參數,這可能是一個優點,因爲在async方法中不可能有ref參數。

+0

不會工作。您的匿名異步函數不會將值返回給外部函數。 – Denis

回答

15

如果你在UI線程上,你真的不應該試圖做這樣的事情,因爲那意味着你會阻塞線程。您應該改爲參數ref,例如通過接受包含要更改的值的簡單類類型的參數。

爲什麼不這樣做的另一個原因是,它仍然不會讓你使用ref參數,因爲lambdas無法訪問ref封閉方法的參數。但如果你真的想這樣做(再一次,我真的認爲你不應該),那麼你將需要得到Task的結果。喜歡的東西:

public string MyCallingMethod() 
{ 
    var task = Task.Run(async() => 
    { 
     return await myMethodAsync(); 
    }); 
    return task.Result; 
} 
+0

很好,自我解決的任務並返回結果。謝謝 – DRapp

40

在非異步方法你可以異步啓動任務,而不是等待結果:

public void MyCallingMethod() 
{ 
    Task t = myMethodAsync(); 
} 

,或者你可以將ContinueWith事件處理程序,這是完成後調用任務,

public void MyCallingMethod() 
{ 
    myMethodAsync().ContinueWith(
     result => 
     { 
      // do stuff with the result 
     }); 
} 

,或者您可以從任務同步得到的結果:

public string MyCallingMethod() 
{ 
    string result = myMethodAsync().Result; 
    return result; 
}