【发布时间】:2013-07-08 22:04:15
【问题描述】:
很抱歉发布这样一个菜鸟问题,但我找不到答案。我还不太擅长单元测试,所以我不确定。这是返回线程安全的字节 [] 的最佳方法吗?也可以在这里初始化数组并在另一个线程中修改它吗?
public async Task<byte[]> GetData()
{
var _buffer = new byte[1024];
try { await Task.Run(() => ModifyArray(_buffer)); }
catch { return null;}
return _buffer.ToArray();
}
我知道 ModifyArray(byte[]) 应该返回值,但它实际上是一个 Socket 接收方法。 我也在看:
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();
}
任何见解将不胜感激。
【问题讨论】:
-
线程不安全代码的标记是一个由一个线程读取并由另一个线程写入的变量。在发布的 sn-p 中没有明显的迹象,_buffer 是一个局部变量,每个线程都有自己的局部变量。我们看不到 ModifyArray() 的作用,它可能是线程不安全的。可能是因为它使用了一个完全未初始化的数组。但正如发布的那样,没有明显的麻烦来源。
-
@HansPassant ModifyArray() 实际上是 Socket 类中的 Receive()。我认为任何线程都可以读取变量但只有一个可以更改它?我写的第二个和第三个代码块有什么区别吗?
-
线程安全针对什么故障模式?您要避免的问题是什么?我的经验是,没有两个人对“线程安全”有相同的定义,所以如果你想要一个可靠的答案,请更具体。
-
这与您的问题无关,但是,请不要这样做:
catch { return null; }。如果发生了不好的事情,您想尽可能多地了解,因此隐藏您可能拥有的有关错误的任何信息不是一个好主意。
标签: c# .net thread-safety