C# 以同步方式执行异步代码

C# 以同步方式执行异步代码,c#,.net,multithreading,task-parallel-library,C#,.net,Multithreading,Task Parallel Library,我有以下异步代码: public async Task<List<PreprocessingTaskResult>> Preprocess(Action onPreprocessingTaskFinished) { var preprocessingTasks = BuildPreprocessingTasks(); var preprocessingTaskResults = new List<PreprocessingTaskResult>();

我有以下异步代码:

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 
}
在某些情况下,我需要以同步方式调用它。对于更简单的情况(当async方法仅返回一个任务时),我通常执行以下操作:

var someTask = AsyncMethod();
Task.Wait(someTask);

但是我不知道应该如何在这里实现它。

任务的
结果
属性将被阻止,直到任务完成,然后返回其结果:

List<PreprocessingTaskResult> result = Preprocess(someAction).Result;
List result=预处理(someAction).result;

任务的
结果
属性将被阻止,直到任务完成,然后返回其结果:

List<PreprocessingTaskResult> result = Preprocess(someAction).Result;
List result=预处理(someAction).result;

同步调用异步代码没有简单的方法。Stephen Toub介绍了一些不同的方法,但没有一种方法适用于所有情况

最好的解决方案是将同步调用代码更改为异步。随着
Microsoft.Bcl.Async
和Xamarin最新版本的出现,异步代码现在在.NET 4.0(及更高版本)、Windows Phone 7.1(及更高版本)、Windows Store、Silverlight 4(及更高版本)、iOS/MonoTouch、Android/MonoDroid和可移植类库上得到了支持,可用于这些平台的任何组合

所以现在没有什么理由不使用
async


但是,如果您绝对需要一个同步API,那么最好的解决方案是使其始终同步。如果您确实需要异步和同步API,这将导致代码重复,这是不幸的,但这是目前最好的解决方案。

同步调用异步代码没有简单的方法。Stephen Toub介绍了一些不同的方法,但没有一种方法适用于所有情况

最好的解决方案是将同步调用代码更改为异步。随着
Microsoft.Bcl.Async
和Xamarin最新版本的出现,异步代码现在在.NET 4.0(及更高版本)、Windows Phone 7.1(及更高版本)、Windows Store、Silverlight 4(及更高版本)、iOS/MonoTouch、Android/MonoDroid和可移植类库上得到了支持,可用于这些平台的任何组合

所以现在没有什么理由不使用
async


但是,如果您绝对需要一个同步API,那么最好的解决方案是使其始终同步。如果您确实需要异步和同步API,这将导致代码重复,这是不幸的,但这是目前最好的解决方案。

最好的解决方案实际上是根本不创建任务,只返回一些委托并直接调用它,这可以在BuildPreprocessingTasks中完成最好的解决方案实际上是根本不创建任务,只返回一些委托并直接调用它,这可以在BuildPreprocessingTasks中完成。问题是这通常会导致死锁。只有在使用同步上下文的环境中。如果它确实会导致死锁,请阅读以下内容:问题是它通常会导致死锁。只有在使用同步上下文的环境中。如果确实导致死锁,请阅读以下内容: