是否可以在非异步方法中调用等待方法?

在C#/ XAML的Windows 8应用程序中,我有时想从非异步方法调用一个等待的方法。

实际上更换它是正确的:

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

这样 :

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

对我来说的好处是我可以在没有等待的情况下使用MyCallingMethod,但这是正确的吗? 如果我想为MyCallingMethod传递ref参数,这可能是一个优点,因为在异步方法中不可能有ref参数。

在非异步方法中,您可以异步启动任务而不是等待结果:

 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; } 

如果你在UI线程上,你真的不应该尝试这样做,因为这意味着你将阻止该线程。 您应该改为使用ref参数,例如通过接受包含要更改的值的简单类类型的参数。

不这样做的另一个原因是它仍然不允许你使用ref参数,因为lambdas不能访问封闭方法的ref参数。

但是如果你真的想这样做(再次,我认为你不应该这样做),那么你需要得到Task的结果。 就像是:

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