QueuedTaskScheduler在Dispose时泄漏任务?

时间:2016-12-19 14:20:51

标签: c# .net task-parallel-library

我试图找出错误做错的地方或Task Parallel Library Extras中的错误。 下面的示例代码说明了我的场景(尽管非常简化)。取消注释后,QueuedTaskSchedulerDispose()会导致TaskWaitAll()无法挂起,因为tasks数组包含WaitingToRun中的多个(好的,大多数)任务} status。

我的印象是QueuedTaskSchedulerDispose()应该等待所有计划任务完成或完全中止。

欢迎任何想法如何修复现有行为。

[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);
    }
}

更新: 我设法通过删除_disposeCancellationIsCancellationRequested方法中的QueuedTaskSchedulerProcessPrioritizedAndBatchedTasks()检查来解决悬而未决的问题。但是,这仅允许执行挂起的任务,在某些情况下,这些任务可能不是所需的行为。无论如何,这可以通过CancellationTokenSourceCreateLinkedTokenSource以及Task周围的简单包装来解决。Run

0 个答案:

没有答案