QueuedTaskScheduler在Dispose时泄漏任务?

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.