1
我很抱歉發佈這樣的noob問題,但我找不到答案。我不擅長單元測試,所以我不確定這一點。這是返回一個線程安全的字節[]的最佳方式嗎?也可以在這裏初始化數組並在另一個線程中修改它?如何返回線程安全字節[]?
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();
}
任何有識之士將不勝感激。
線程不安全代碼的標記是一個變量,它由一個線程讀取並由另一個線程寫入。在發佈的代碼片段中沒有明顯的跡象,_buffer是一個局部變量,每個線程都有自己的局部變量。我們看不到什麼是ModifyArray(),它可能是線程不安全的。可能是因爲它使用了一個完全未初始化的數組。但是,張貼沒有明顯的麻煩來源。 –
@HansPassant ModifyArray()實際上是Socket類中的Receive()。我以爲任何線程都可以讀取一個變量,但只有一個可以改變它?我寫的第二個和第三個代碼塊有區別嗎? –
線程安全*針對哪種失敗模式*?你試圖避免的問題是什麼?我的經驗是,沒有兩個人對「線程安全」有相同的定義,所以如果你想得到一個堅實的答案,更具體一些。 –