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

Tho*_*dre 30 c# async-await windows-8

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

实际上替换它是正确的:

  public async Task<string> MyCallingMethod()
  {
      string result = await myMethodAsync();
      return result;
  }
Run Code Online (Sandbox Code Playgroud)

这样 :

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

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

Mar*_*han 52

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

public void MyCallingMethod()
{
    Task t = myMethodAsync();
}
Run Code Online (Sandbox Code Playgroud)

或者你可以附上在完成任务后调用的ContinueWith事件处理程序,

public void MyCallingMethod()
{
    myMethodAsync().ContinueWith(
        result =>
        {
            // do stuff with the result
        });
}
Run Code Online (Sandbox Code Playgroud)

或者您可以同步从任务中获取结果:

public string MyCallingMethod()
{
    string result = myMethodAsync().Result;
    return result;
}
Run Code Online (Sandbox Code Playgroud)


svi*_*ick 19

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

不执行此操作的另一个原因是它仍然不允许您使用ref参数,因为lambdas无法访问ref封闭方法的参数.

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

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

  • 这是否可以避免因主线程阻塞在 .Result 或 Wait() 上而发生的死锁?您所拥有的和调用“var res = myMethodAsync().Result”有什么区别 (2认同)