c# – 如何确保Task.Factory.StartNew不会减慢主线程的速度?
发布时间:2020-12-15 22:25:41 所属栏目:百科 来源:网络整理
导读:有一堆压缩数据块必须异步放气 – 不会阻塞或减慢任何形状或形式的主线程. 解压缩后,主线程将使用解压缩的块. 目前我这样做: foreach (var chunkPair in compressedChunkData){ var task = Task.Factory.StartNewChunk(() = { var compressedBytes = Conver
有一堆压缩数据块必须异步放气 – 不会阻塞或减慢任何形状或形式的主线程.
解压缩后,主线程将使用解压缩的块. 目前我这样做: 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 解决方法
您可以使用自定义TaskScheduler将线程优先级设置为较低的值. Windows始终首先调度优先级较高的线程.
也许您需要在任务上设置过期日期,以便它们不会排队太多.听起来您需要低延迟处理.每个任务都可以检查它是否是第一个动作,是否超过N秒前安排,如果是,则立即退出. 另一种设计是生产者/消费者场景,其中低优先级线程正在开展工作.鉴于您的要求,我认为没有必要,但这是一个更灵活的解决方案.创建数百个任务不是问题.每个任务只是一个小的内存数据结构.任务!=线程. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |