如果您没有任何异步代码,您如何处理返回 Task 的第 3 方接口?

How do you handle a 3rd party interface returning Task if you don't have any async code?

我正在使用第三方 dll,它公开了 return 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);
    }
}

此外:

如果您没有异步工作要做,请不要包含 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,我会考虑考虑是否可以将代码重写为实际异步或包装代码进入后台线程,但如果这是最后的手段,我只会做一个后台线程。