gpt4 book ai didi

c# - async void 的替换

转载 作者:行者123 更新时间:2023-11-30 20:19:21 27 4
gpt4 key购买 nike

我正在开发一个应用程序来监控某些任务(例如,如果某些服务/网站当前正在运行,数据库中是否存在某些记录等)。由于大多数这些任务都需要长时间运行,所以我将 TPLasync/await 结合使用。

我有一个用于所有此类任务的基类:

public abstract class LongRunningOperation
{
// .. some props...

internal async void Start()
{
try
{
this.Status = OperationStatus.Started;
await this.DoStart();
this.Status = OperationStatus.Finished;
}
catch (Exception e)
{
this.Status = OperationStatus.Error;
this.Message = e.ToString();
}
}

protected abstract Task DoStart();
}

启动这些任务的方法如下所示:

public static LongRunningOperation[] LaunchOperations()
{
LongRunningOperation[] operations = GetAllLongRunningOperations();
foreach (var o in operations)
Task.Factory.StartNew(() => { o.Start(); });
return operations;
}

此方法返回的数组用于监视所有 LongRunningOperation 并记录统计信息。目前我有一个控制台应用程序,它有一个 while (true) 循环,它在屏幕上打印出每个操作的统计信息(名称、状态、当前运行时间)(每秒刷新一次),直到所有操作完成.

困扰我的是 async void 方法。我读到使用 async void 方法是不好的做法,但是:

  • 我不知道他们在我的场景中会造成什么伤害
  • 如果我将 Start 方法更改为返回 Task,它的返回值将永远不会在任何地方使用,我想不出我为什么需要它

如果有人能澄清这些问题,我将不胜感激

最佳答案

异步 ​​void 方法是一种“即发即弃”操作。您不能等待任何结果,也不知道操作何时完成以及是否成功。

基本上,当您确定永远不需要知道操作何时完成以及操作执行是否成功时(例如写入日志),您应该使用 void。

使用返回 Task 的异步方法,调用者可以等待操作完成,还可以处理操作执行期间发生的异常。

总而言之,如果您不需要结果,异步 Task 会稍微好一些,因为您可以等待它以及处理异常和处理任务排序。

关于c# - async void 的替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38995861/

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