我有一个我无法改变的第三方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
实现这一目标的正确方法是什么? 我需要等待SomeDLL SyncMethod返回,这就是我使用ContinueWith的原因。
程序bool Foo是否需要设置为“async”?
答案 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);
}