gpt4 book ai didi

c# - 如何围绕 C# 4.0 任务所处理的数据创建闭包?

转载 作者:太空狗 更新时间:2023-10-30 01:09:18 26 4
gpt4 key购买 nike

我正在分块加密数据。我正在将每个数据 block 传递给像 yay 这样的任务:

private static Task<string> EncryptChunk( byte[] buffer, CryptoEngine c )
{
var tcs = new TaskCompletionSource<string>();
Task.Factory.StartNew( () =>
{
tcs.SetResult( c.Encrypt( buffer ) );
} );
return tcs.Task;
}

当我调试调用此方法的代码时,我可以看到它传递了正确的 block 作为缓冲区参数。但是,如果我在上面的 StartNew 中设置断点,我会看到该缓冲区始终是主线程遇到的最后一个缓冲区。

我做错了什么?

最佳答案

我的猜测是您正在重复使用相同的字节数组。 参数 将被捕获 - 但在这种情况下,因为您的方法中没有任何内容捕获参数,所以它有效地捕获了引用。如果您希望能够重用原始数组(即用新数据填充它)但仍读取任务中的旧数据,则需要复制数据。例如

private static Task<string> EncryptChunk( byte[] buffer, CryptoEngine c )
{
buffer = buffer.ToArray(); // Copy the data
var tcs = new TaskCompletionSource<string>();
Task.Factory.StartNew( () =>
{
tcs.SetResult( c.Encrypt( buffer ) );
} );
return tcs.Task;
}

顺便说一句,你为什么在这里使用 TaskCompletionSource,而不仅仅是:

return Task<string>.Factory.StartNew(() => c.Encrypt(buffer));

或使用类型推断:

return Task.Factory.StartNew(() => c.Encrypt(buffer));

关于c# - 如何围绕 C# 4.0 任务所处理的数据创建闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7168594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com