如何返回线程安全字节[]

本文关键字:安全 字节 线程 何返回 返回 | 更新日期: 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代码中执行,而不是在库中执行。