我有以下异步代码:
public async Task<List<PreprocessingTaskResult>> Preprocess(Action onPreprocessingTaskFinished)
{
var preprocessingTasks = BuildPreprocessingTasks();
var preprocessingTaskResults = new List<PreprocessingTaskResult>();
while (preprocessingTasks.Count > 0)
{
//Wait till at least one task is completed
await TaskEx.WhenAny(preprocessingTasks.ToArray());
onPreprocessingTaskFinished();
}
return
}
和异步使用代码
var preprocessingTaskResults = await Preprocess(someAction);
在某些情况下,我需要以同步方式调用它。对于更简单的情况(当异步方法只返回一个任务时)我曾经做过以下事情:
var someTask = AsyncMethod();
Task.Wait(someTask);
但我很困惑,我应该在这里实施它。
答案 0 :(得分:3)
任务的Result
属性将阻塞,直到任务完成,然后返回其结果:
List<PreprocessingTaskResult> result = Preprocess(someAction).Result;
http://msdn.microsoft.com/en-us/library/dd321468(v=vs.110).aspx
答案 1 :(得分:1)
没有简单的方法可以同步调用异步代码。 Stephen Toub介绍了一些不同的方法here,但没有一种方法适用于所有情况。
最佳解决方案是将同步调用代码更改为异步。随着Microsoft.Bcl.Async
和最近发布的Xamarin的出现,.NET 4.0(及更高版本),Windows Phone 7.1(及更高版本),Windows Store,Silverlight 4(及更高版本),iOS / MonoTouch现在支持异步代码。 ,Android / MonoDroid,以及适用于这些平台的任何组合的可移植类库。
所以现在不使用async
的理由很少。
但是如果绝对需要同步API,那么最好的解决方案就是让它一直同步。如果你确实需要异步和同步API,这将导致代码重复,这是不幸的,但它是目前最好的解决方案。