在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参数。
答案 0 :(得分:50)
在非异步方法中,您可以异步启动任务而不是等待结果:
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;
}
答案 1 :(得分:19)
如果你在UI线程上,你真的不应该尝试做类似的事情,因为这意味着你将阻止线程。您应该使用ref
参数,例如接受包含要更改的值的简单类类型的参数。
不执行此操作的另一个原因是它仍然不允许您使用ref
参数,因为lambdas无法访问封闭方法的ref
参数。
但如果你真的想这样做(再次,我认为你不应该这样做),那么你需要得到Task
的结果。类似的东西:
public string MyCallingMethod()
{
var task = Task.Run(async () =>
{
return await myMethodAsync();
});
return task.Result;
}