Ale*_*yov 8 .net c# task-parallel-library
我试图找出我在哪里做错了什么或者这是任务并行库额外的错误.下面的示例代码说明了我的场景(尽管非常简化).一旦取消注释,QueuedTaskScheduler.Dispose()原因Task.WaitAll()因为tasks数组包含状态中的几个(好的,大多数)任务而无限期地挂起WaitingToRun.
我的印象是QueuedTaskScheduler.Dispose()应该等待所有计划任务完成或完全中止它们.
任何想法如何修复现有行为都是受欢迎的.
[TestClass]
public class TestTPLX
{
[TestMethod]
public void CheckDisposeWorks()
{
var qts = new QueuedTaskScheduler();
var ts = qts.ActivateNewQueue(100);
var cts = new CancellationTokenSource();
var tasks = Enumerable.Range(0, 20).Select(_ => Task.Factory.StartNew(() =>
{
Thread.Sleep(10);
},
cts.Token, TaskCreationOptions.None, ts))
.ToArray();
cts.Cancel();
// test hangs when line below is uncommented
// qts.Dispose();
Task.WaitAll(tasks);
}
}
Run Code Online (Sandbox Code Playgroud)
更新:我设法解决了删除问题_disposeCancellation.IsCancellationRequested检查里面QueuedTaskScheduler.ProcessPrioritizedAndBatchedTasks()方法.但是,这仅允许执行挂起的任务,在某些情况下,这些任务可能不是所需的行为.无论如何,这可以通过其他方式解决CancellationTokenSource.CreateLinkedTokenSource和一个简单的包装Task.Run.
| 归档时间: |
|
| 查看次数: |
290 次 |
| 最近记录: |