我有一些代碼,在我需要在主線程上確認和處理的新線程上拋出異常。爲了實現這一點,我通過使用一個包含引發異常的字段來共享線程之間的狀態。檢查是否爲空線程安全?
我的問題是當我在下面的代碼示例中檢查時,是否需要使用鎖來檢查null?
public class MyClass
{
readonly object _exceptionLock = new object();
Exception _exception;
public MyClass()
{
Task.Run(() =>
{
while (CheckIsExceptionNull())
{
// This conditional will return true if 'something has gone wrong'.
if(CheckIfMyCodeHasGoneWrong())
{
lock(_exceptionLock)
{
_exception = new GoneWrongException();
}
}
}
});
}
bool CheckIsExceptionNull() // Is this method actually necessary?
{
lock (_exceptionLock)
{
return _exception == null;
}
}
// This method gets fired periodically on the Main Thread.
void RethrowExceptionsOnMainThread()
{
if (!CheckIsExceptionNull())
{
lock (_exceptionLock)
{
throw _exception; // Does this throw need to be in a lock?
}
}
}
}
此外,我需要使用鎖在主線程拋出異常的時候?
任何時間的問題是 「我是否需要使用鎖」,這是可疑的。一個無爭議的鎖需要十幾納秒。你的問題是「我的程序已經保證是正確的,但是十幾納秒太慢了,這個性能問題可能歸因於一個鎖,並且我知道它在市場上不會成功,所以我可以刪除它這個鎖,並保持我的程序的正確性?「。你的代碼甚至沒有正確的開始,我非常懷疑在無爭議的鎖中花費的納秒會導致你的程序被認爲太慢。 –
一個更好的問題完全是「如何通過使用任務並行庫來表達異步執行任務的成功和失敗的概念,從而消除我對顯式線程管理和共享內存的使用?」。 Task對象已經擁有這樣的屬性,在執行任務期間引發的異常可以安全地緩存並重新引發到管理任務的執行上下文中。 –