Implementing an interface that requires a Task return type in synchronous code类似,尽管我很好奇我是否应该忽略我的情况所产生的编译器错误。

假设我有一个这样的接口(interface):

public interface IAmAwesome {
    Task MakeAwesomeAsync();
}

在某些实现中,可以通过使用asyncawait异步完成而获得令人赞叹的 yield 。这确实是接口(interface)试图允许的。

在其他情况下(可能很少见),只需一种简单的同步方法即可使其表现出色。因此,让我们假设实现看起来像这样:
public class SimplyAwesome : IAmAwesome {
    public async Task MakeAwesomeAsync() {
        // Some really awesome stuff here...
    }
}

这可行,但是编译器警告:



编译器实际上是在建议这种解决方案:
public class SimplyAwesome : IAmAwesome {
    public async Task MakeAwesomeAsync() {
        await Task.Run(() => {
            // Some really awesome stuff here, but on a BACKGROUND THREAD! WOW!
        });
    }
}

我的问题是-当我选择忽略此编译器警告时,应该确定什么?在某些情况下,工作是如此简单,以至于产生一个线程无疑会适得其反。

最佳答案

如果您确实确实想同步完成工作,那么您将知道async方法将始终同步运行,在这种情况下这是理想的选择,那么请务必忽略该警告。如果您了解了警告所提示的内容,并且认为警告所描述的操作是正确的,那么这不是问题。毕竟这是一个警告,而不是一个错误。

当然,另一种选择是不使用async方法,而只是使用Task.FromResult来返回已经完成的任务。它将改变错误处理的语义(除非您还捕获所有异常并将它们包装到返回的任务中),因此至少要牢记这一点。如果您确实希望通过结果Task传播异常,则可能值得离开async方法,而只是取消警告。

关于c# - 返回Task的接口(interface)的同步实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28197902/

10-17 01:33