如果没有任何异步代码,如何处理返回Task的第三方界面?

时间:2016-11-14 19:52:10

标签: c# .net asynchronous synchronous

我正在使用第三方dll公开返回TaskTask<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>的方法?
  • 作者是否正确使用* Async()后缀方法名称?如果我在不将异步附加到名称的情况下编写异步方法,代码分析就不会抱怨。

1 个答案:

答案 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很长一段时间,我会考虑查看您是否可以将代码重新编写为实际异步或将代码包装到后台线程,但我只会做一个后台线程,如果它是最后的手段。