微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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秒前安排,如果是,则立即退出.

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐