gpt4 book ai didi

c# - 到 Task.Run 或不到 Task.Run

转载 作者:太空狗 更新时间:2023-10-29 21:12:37 24 4
gpt4 key购买 nike

假设我有一个包含异步方法的接口(interface),并且我有该接口(interface)的两个不同实现。两种实现之一自然是异步的,而另一种则不是。实现非异步方法的“最正确”方法是什么?

public interface ISomething {
Task<Foo> DoSomethingAsync();
}

// Normal async implementation
public class Implementation1 : ISomething {
async Task<Foo> ISomething.DoSomethingAsync() {
return await DoSomethingElseAsync();
}
}

// Non-async implementation
public class Implementation2 : ISomething {
// Should it be:
async Task<Foo> ISomething.DoSomethingAsync() {
return await Task.Run(() => DoSomethingElse());
}
// Or:
async Task<Foo> ISomething.DoSomethingAsync() {
return DoSomethingElse();
}
}

我努力跟上 Stephen Cleary 的 blog ,而且我知道这些实际上都没有提供任何异步好处,我对此表示同意。第二个对我来说似乎更正确,因为它不会伪装成它不是的东西,但它确实会发出编译器警告,这些警告加起来会让人分心。

这一切都在 ASP.NET 中(包括 Web MVC 和 WebAPI),如果有区别的话。

最佳答案

您可以完全放弃 async 修饰符并使用 Task.FromResult 同步返回已完成的任务:

Task<Foo> ISomething.DoSomethingAsync()
{
return Task.FromResult(DoSomethingElse());
}

这会处理警告并具有更好的性能,因为它不需要 async 方法的状态机开销。

但是,这确实 change the semantics of exception handling一点点。如果这是一个问题,那么您应该使用同步 async 方法方法并接受警告(或通过评论将其关闭):

#pragma warning disable 1998
async Task<Foo> ISomething.DoSomethingAsync()
#pragma warning restore 1998
{
return DoSomethingElse();
}

正如 Stephen Cleary 建议的那样,您还可以通过等待已完成的任务来处理该警告(同时保持方法同步):

async Task<Foo> ISomething.DoSomethingAsync() 
{
await Task.FromResult(false); // or Task.CompletedTask in .Net 4.6
return DoSomethingElse();
}

关于c# - 到 Task.Run 或不到 Task.Run,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28929647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com