Hem*_*ant 0 .net c# task-parallel-library async-await
如果我有一个异步方法:
async Task Process()
{
while (condition)
{
await ...;
}
}
Run Code Online (Sandbox Code Playgroud)
我需要安排执行此方法.所以我使用:
Task.Run(Process);
Run Code Online (Sandbox Code Playgroud)
我是否需要保留方法Task返回的对象的引用,Task.Run以确保Process执行完成?
这里有更多的上下文:我需要在我的应用程序中创建大量(大约50K)任务队列.所以我想创建一个无线程队列处理设计,当队列为空时(因为大多数队列都是这样),它没有成本(除了内存).
样本类的要点:https://gist.github.com/hemant-jangid/e990b27507596c086e5651f504d0521f
一般来说,你不应该扔掉Tasks.这不是关于确保任务将运行(它将是1),而是关于观察异常.如果你没有做任何事情,Task那么找出问题出错的唯一方法就是添加一个UnobservedTaskException事件处理程序.不理想.
最好将代码await放在try/ catchblock中,或者ContinueWith在你指定的地方注册一个处理程序,应该在故障上调用它.
不幸的是(IMO).NET的行为改变了大约4.5,因此未观察到的异常不再拆除该过程.这意味着如果你没有观察到它们,你就会得到失败的代码而无法跟踪/记录这种情况.
在一般,做Task.Run周围已经产生了一个方法Task是不必要的,并且反作用.该方法已经承诺提供Task- 为什么要将其包装在第二个?(该方法返回的方式和原因是该方法Task的实现细节,而不是调用者的业务).如果您正在调用的方法执行重要的 CPU绑定工作而您(调用方)当前处于"宝贵"的上下文中(例如在UI线程上),那么您应该真的这样做.
1假设整个过程存活的时间足够长等.
| 归档时间: |
|
| 查看次数: |
123 次 |
| 最近记录: |