如何返回线程安全字节[]
本文关键字:安全 字节 线程 何返回 返回 | 更新日期: 2023-09-27 18:21:19
很抱歉发布这样一个愚蠢的问题,但我找不到答案。我还不太擅长单元测试,所以对此我不太确定。这是返回线程安全字节[]的最佳方式吗?另外,可以在这里初始化数组并在另一个线程中修改它吗?
public async Task<byte[]> GetData()
{
var _buffer = new byte[1024];
try { await Task.Run(() => ModifyArray(_buffer)); }
catch { return null;}
return _buffer.ToArray();
}
我知道ModifyArray(byte[])应该返回值,但它实际上是一个套接字接收方法。我也在看:
public async Task<byte[]> GetData()
{
return Task.Run(() =>
{
var _buffer = new byte[1024];
try { ModifyArray(_buffer); }
catch { return null;}
return _buffer.ToArray();
});
}
或者我应该像这个一样把ToArray()移到外面吗
public async Task<byte[]> GetData()
{
return (Task.Run(() => {...});).ToArray();
}
任何见解都将不胜感激。
如果您想返回数组的快照,但又不想让调用方修改您的内部状态,那么创建数组的副本是必要的。
但事实并非如此。在方法的每个调用中创建一个新数组,而不在乎调用者是否修改它(假设ModifyArray()
不存储数组)。
这意味着以下代码应该是可以的:
public async Task<byte[]> GetData()
{
var _buffer = new byte[1024];
await Task.Run(() => ModifyArray(_buffer));
return _buffer;
}
另一种选择是使用.Net与"只读数组"最接近的东西:IReadOnlyList<T>
(.Net 4.5中的新内容):
public async Task<IReadOnlyList<byte>> GetData()
{
var _buffer = new byte[1024];
await Task.Run(() => ModifyArray(_buffer));
return _buffer;
}
此外,像这样使用await Task.Run()
通常不是一个好主意。如果您想充分使用异步,请使用真正的异步方法。如果您想从UI线程中卸载一些计算,请在UI代码中执行,而不是在库中执行。