And*_*ges 2 .net c# task-parallel-library async-await
我正在开发一个监视某些任务的应用程序(例如,如果某些服务/网站当前正在运行,数据库中存在某些记录等).而且,因为大多数这些任务长时间运行,我用TPL用async/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();
}
Run Code Online (Sandbox Code Playgroud)
启动这些任务的方法如下所示:
public static LongRunningOperation[] LaunchOperations()
{
LongRunningOperation[] operations = GetAllLongRunningOperations();
foreach (var o in operations)
Task.Factory.StartNew(() => { o.Start(); });
return operations;
}
Run Code Online (Sandbox Code Playgroud)
此方法返回的数组用于监视所有LongRunningOperations并记录统计信息.目前我有一个控制台应用程序,它有一个while (true)循环,可以打印屏幕上每个操作的统计信息(名称,状态,当前运行时)(每秒刷新一次),直到所有操作都完成.
困扰我的是async void方法.我读过使用async void方法是不好的做法,但是:
Start方法返回Task,它的返回值永远不会在任何地方使用,我想不出为什么我需要它如果有人能澄清这些观点,我会很感激
异步void方法是"即发即弃"操作.您不能等待任何结果,也不会知道操作何时完成以及是否成功.
基本上你应该使用void,当你确定你永远不需要知道操作何时完成以及操作执行是否成功(例如写日志).
使用返回的异步方法,Task调用者能够等待操作完成,并且还处理在执行操作期间发生的异常.
总而言之,如果您不需要结果,异步Task会稍好一些,因为您可以等待它以及处理异常并处理任务排序.
| 归档时间: |
|
| 查看次数: |
966 次 |
| 最近记录: |