小编Ale*_*yov的帖子

QueuedTaskScheduler在Dispose时泄漏任务?

我试图找出我在哪里做错了什么或者这是任务并行库额外的错误.下面的示例代码说明了我的场景(尽管非常简化).一旦取消注释,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 …

.net c# task-parallel-library

8
推荐指数
0
解决办法
290
查看次数

将数组拆分成块 - 有更快的方法吗?

我正在寻找最快的方法将数组拆分成固定大小的块(当然,最后一个可以更小).我在整个网站上看过并没有找到任何性能方面的比较,所以我写了它们,结果如下:

以微秒为单位的时间,均值/错误/ stddev

对于int[]- 30.02 | 0.1002 | 0.0937

对于IEnumerable<int>- 76.67 | 0.2146 | 0.1902

更新:以下版本(在@Markus的回答中)是139.5 | 0.6702 | 0.5597

最受欢迎这里使用LINQ的SO和经常推荐的方法 GroupBy使用index/chunkSize是一个没有去- 267微秒是比任何上述实施方式也更大.

有没有更快的方法来分割数组?

PS这是代码ArrayIEnumerable<T>:

    /// <summary>
    /// Splits <paramref name="source"/> into chunks of size not greater than <paramref name="chunkMaxSize"/>
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="source">Array to be split</param>
    /// <param name="chunkMaxSize">Max size of chunk</param>
    /// <returns><see cref="IEnumerable{T}"/> of <see cref="Array"/> of <typeparam name="T"/></returns>
    public static …
Run Code Online (Sandbox Code Playgroud)

.net c# arrays performance

2
推荐指数
1
解决办法
1260
查看次数

标签 统计

.net ×2

c# ×2

arrays ×1

performance ×1

task-parallel-library ×1