gpt4 book ai didi

c# - 如何正确编写自定义任务返回方法

转载 作者:太空狗 更新时间:2023-10-29 23:33:06 24 4
gpt4 key购买 nike

为了异步运行代码(例如使用 async/await),我需要一个合适的任务。当然,框架中有几个预定义的方法,涵盖了最频繁的操作,但有时我想自己写一个。我是 C# 的新手,所以很可能我做错了,但至少我对我目前的做法并不完全满意。有关我正在做的事情,请参见以下示例:

public async Task<bool> doHeavyWork()
{
var b1 = await this.Foo();
//var b2 = await Task<bool>.Factory.StartNew(Bar); //using Task.Run
var b2 = await Task.Run(()=>Bar());
return b1 & b2;
}

public Task<bool> Foo()
{
return Task.Factory.StartNew(() =>
{
//do a lot of work without awaiting
//any other Task
return false;
});
}

public bool Bar()
{
//do a lot of work without awaiting any other task
return false;
}

一般来说,我会创建和使用像 Foo 示例这样的方法,但是有一个“额外的”lambda 包含整个方法逻辑,恕我直言,它看起来不太漂亮。另一种选择是使用任何方法,例如 Bar 示例,但我认为这更糟,因为不清楚该方法是否应该异步运行(除了正确的方法名称,如 BarAsync)并且 Task.Factory.StartNew 可能必须在程序中重复多次。我不知道如何告诉编译器‘这个方法返回一个任务,请在调用时将它作为一个整体包装到一个任务中’,这就是我想要做的。

最后我的问题是:编写这种方法的最佳方式是什么?我可以摆脱“额外的”lambda(当然不添加额外的命名方法)吗?

编辑正如 Servy 所说,总是有充分的理由拥有该方法的同步版本。仅当绝对必要时才应提供异步版本(Stephen Cleary 的链接)。

最佳答案

如果有人想调用 Bar 而不在新线程/任务中启动它,世界会结束吗?如果后台线程中已经有另一个方法,那么它不需要启动一个新任务来运行那个长时间运行的代码怎么办?如果该方法最终被重构为从桌面应用程序上下文以及 ASP 或控制台上下文调用的类库怎么办?在那些其他上下文中,该方法可能只需要直接运行,而不是作为 Task

我会说你的代码应该看起来像 Bar 那样,除非绝对必要,在任何情况下,都应该在不启动新的 Task 的情况下运行该代码.

另请注意,对于较新版本的 .NET,您应该从 Task.Factory.StartNew 切换到 Task.Run,因此代码量应该会减少(一点点)。

关于c# - 如何正确编写自定义任务返回方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12429622/

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