我试图找出错误做错的地方或Task Parallel Library Extras中的错误。
下面的示例代码说明了我的场景(尽管非常简化)。取消注释后,QueuedTaskScheduler
。Dispose()
会导致Task
。WaitAll()
无法挂起,因为tasks
数组包含WaitingToRun
中的多个(好的,大多数)任务} status。
我的印象是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);
}
}
更新:
我设法通过删除_disposeCancellation
。IsCancellationRequested
方法中的QueuedTaskScheduler
。ProcessPrioritizedAndBatchedTasks()
检查来解决悬而未决的问题。但是,这仅允许执行挂起的任务,在某些情况下,这些任务可能不是所需的行为。无论如何,这可以通过CancellationTokenSource
。CreateLinkedTokenSource
以及Task
周围的简单包装来解决。Run
。