如果您没有任何异步代码,您如何处理返回 Task 的第 3 方接口?
How do you handle a 3rd party interface returning Task if you don't have any async code?
我正在使用第三方 dll,它公开了 return Task
和 Task<T>
的方法。我对该程序集或接口没有任何控制权,并且我假设作者假设所有内容都需要异步,因为方法的命名是 *Async() ,如下所示。
鉴于此,如果我实际上没有任何异步代码,我该如何正确实现接口 运行?
public interface IFoo
{
Task DoWorkAsync();
Task<int> GetValueAsync();
}
我的尝试如下:
public class FooBar : IFoo
{
public async Task DoWorkAsync()
{
// Do Some Work
await Task.Yield();
}
public async Task<int> GetValueAsync()
{
// Do Some Work
var result = ...;
return Task.FromResult(result);
}
}
此外:
- 作者仅公开 returned
Task
/Task<T>
的方法是否正确?
- 作者在方法名称后缀 *Async() 中是否正确?如果我编写异步方法时没有在名称后附加 Async,代码分析不会抱怨。
如果您没有异步工作要做,请不要包含 async
关键字。您的 GetValueAsnyc
函数几乎是正确的,您只需要删除 async
。对于您的DoWorkAsync
,您不应该将方法标记为异步和return 已完成的任务。
public class FooBar : IFoo
{
public Task DoWorkAsync()
{
// Do Some Work
//If you can use .NET 4.6
return Task.CompletedTask;
//For older versions, the thing you pass in does not matter, I like to use bool.
return Task.FromResult(false);
}
public Task<int> GetValueAsync()
{
// Do Some Work
var result = ...;
return Task.FromResult(result);
}
}
但是,如果您的代码很慢,并且您最终会长时间阻塞 UI,我会考虑考虑是否可以将代码重写为实际异步或包装代码进入后台线程,但如果这是最后的手段,我只会做一个后台线程。
我正在使用第三方 dll,它公开了 return Task
和 Task<T>
的方法。我对该程序集或接口没有任何控制权,并且我假设作者假设所有内容都需要异步,因为方法的命名是 *Async() ,如下所示。
鉴于此,如果我实际上没有任何异步代码,我该如何正确实现接口 运行?
public interface IFoo
{
Task DoWorkAsync();
Task<int> GetValueAsync();
}
我的尝试如下:
public class FooBar : IFoo
{
public async Task DoWorkAsync()
{
// Do Some Work
await Task.Yield();
}
public async Task<int> GetValueAsync()
{
// Do Some Work
var result = ...;
return Task.FromResult(result);
}
}
此外:
- 作者仅公开 returned
Task
/Task<T>
的方法是否正确? - 作者在方法名称后缀 *Async() 中是否正确?如果我编写异步方法时没有在名称后附加 Async,代码分析不会抱怨。
如果您没有异步工作要做,请不要包含 async
关键字。您的 GetValueAsnyc
函数几乎是正确的,您只需要删除 async
。对于您的DoWorkAsync
,您不应该将方法标记为异步和return 已完成的任务。
public class FooBar : IFoo
{
public Task DoWorkAsync()
{
// Do Some Work
//If you can use .NET 4.6
return Task.CompletedTask;
//For older versions, the thing you pass in does not matter, I like to use bool.
return Task.FromResult(false);
}
public Task<int> GetValueAsync()
{
// Do Some Work
var result = ...;
return Task.FromResult(result);
}
}
但是,如果您的代码很慢,并且您最终会长时间阻塞 UI,我会考虑考虑是否可以将代码重写为实际异步或包装代码进入后台线程,但如果这是最后的手段,我只会做一个后台线程。