有一堆压缩数据块必须被异步压缩- 不会阻塞或减慢任何形状或形式的主线程。
解压缩后的块将在解压缩后立即被主线程使用。
目前我这样做:
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
每个核心线程和上下文仅在主线程被阻塞的那些短暂时刻从主线程切换?
编辑:foreach 循环并不是代码中唯一变慢的部分,只要有大量的解压任务运行,主线程就会显着减慢。
EDIT2:要解压的新数据一直到达,循环不会只运行一次:
- 假设您有 250 件物品
compressedChunkData
首先到达 - 下一帧你有 10 个项目,接下来是 12 个,接下来是 0 个,接下来是 2 个,等等。