我正在使用第三方dll公开返回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);
}
}
此外:
Task
/ Task<T>
的方法?答案 0 :(得分:3)
如果您没有异步工作,请不要包含async
关键字。您的GetValueAsnyc
功能几乎正确,您只需删除async
即可。对于DoWorkAsync
,您不应该将方法标记为异步并返回已完成的任务。
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很长一段时间,我会考虑查看您是否可以将代码重新编写为实际异步或将代码包装到后台线程,但我只会做一个后台线程,如果它是最后的手段。