2012-09-13 102 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; 
}