39

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

实际上替换它是否正确:

  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 参数,这可能是一个优势,因为在异步方法中不可能有 ref 参数。

4

2 回答 2

62

In non-async method you can either start the Task asynchronously and not wait for the result:

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

or you can attach ContinueWith event handler, which is called after finishing the Task,

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

or you can get the result from the Task synchronously:

public string MyCallingMethod()
{
    string result = myMethodAsync().Result;
    return result;
}
于 2012-09-13T13:18:24.953 回答
25

如果你在 UI 线程上,你真的不应该尝试做这样的事情,因为这意味着你会阻塞线程。相反,您应该解决该ref参数,例如通过接受一个简单类类型的参数,其中包含您要更改的值。

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

但是,如果您真的想这样做(同样,我真的认为您不应该这样做),那么您将需要获得Task. 就像是:

public string MyCallingMethod()
{
    var task = Task.Run(async () =>
    {
        return await myMethodAsync();
    });
    return task.Result;
}
于 2012-09-13T09:26:37.510 回答