任务<class>调用非异步方法</class>

时间:2013-11-15 17:57:01

标签: c# task-parallel-library

我有一个我无法改变的第三方DLL,我想让它的异步方法之一 所以我有:

procedure bool Food()
{
   Task<ReturnClass> response = SomeDLL.SyncMethod(); // Method returns "ReturnClass"

   response.ContinueWith (_ => 
   {
     return response.Result != null;
   });
 }

我得到了已知的编译错误:
无法将类型'SomeDLL.ReturnClass'隐式转换为'System.Threading.Tasks.Task'

重要的是要注意我无法更改第三方DLL

  1. 实现这一目标的正确方法是什么? 我需要等待SomeDLL SyncMethod返回,这就是我使用ContinueWith的原因。

  2. 程序bool Foo是否需要设置为“async”?

1 个答案:

答案 0 :(得分:2)

你说你想让方法异步,但你没有说明原因。如果您希望获得异步的可扩展性改进,那么这是不可能的:SyncMethod()将阻止一个线程,你无能为力。

如果您在UI应用程序中并希望获得更好的响应能力,那么您可以通过使用Task.Run()在后​​台线程上调用您的方法来实现。类似的东西:

async Task<bool> FoodAsync()
{
   Task<ReturnClass> response = Task.Run(() => SomeDLL.SyncMethod());

   return await response != null;
}

这假设您使用的是C#5。如果不是这样,您仍然可以这样做,但代码会更复杂:

Task<bool> FoodAsync()
{
   Task<ReturnClass> response =
       Task.Factory.StartNew(() => SomeDLL.SyncMethod());

   return response.ContinueWith(_ => response.Result != null);
}