c# – 如何确保Task.Factory.StartNew不会减慢主线程的速度?

有一堆压缩数据块必须异步放气 – 不会阻塞或减慢任何形状或形式的主线程.

解压缩后,主线程将使用解压缩的块.

目前我这样做:

foreach (var chunkPair in compressedChunkData)
{                        
    var task = Task.Factory.StartNew<Chunk>(() =>
    {
        var compressedBytes = Convert.FromBase64String(chunkPair.Value);
        var chunk = Decompress(compressedBytes);
        return chunk;
    }).ContinueWith((finishedTask) =>
    {
        var chunk = finishedTask.Result;
        TaskFinishActions.Enqueue(() =>
        {
            chunk.PostSerialize();
            document.Chunks.Add(chunkPair.Key, chunk);
        });
    });
}
// By the time we get here 20ms has passed!!!

问题是,这似乎劫持了主线程正在运行的核心,这会影响性能.

有没有办法让TaskFactory只在主线程被阻止的那些短暂时刻内,每个核心的线程和上下文切换远离mainthread?

编辑:foreach循环不是代码中唯一变慢的部分,只要有大量的解压缩任务在运行,mainthread就会显着减慢.

EDIT2:解压缩的新数据一直到达,循环不运行一次:

>假设您有250个物品首先到达compressedChunkData
>下一帧你有10个项目,接下来的12个,接下来的0个,接下来的2个等等.

最佳答案 您可以使用自定义TaskScheduler将线程优先级设置为较低的值. Windows始终首先调度优先级较高的线程.

也许您需要在任务上设置过期日期,以便它们不会排队太多.听起来您需要低延迟处理.每个任务都可以检查它是否是第一个动作,是否超过N秒前安排,如果是,则立即退出.

另一种设计是生产者/消费者场景,其中低优先级线程正在开展工作.鉴于您的要求,我认为没有必要,但这是一个更灵活的解决方案.创建数百个任务不是问题.每个任务只是一个小的内存数据结构.任务!=线程.

点赞