Interlocked.Exchange
是你在找什麼對於。不幸的是,如上所述,你不能用它與bool
,這是一個恥辱。一種替代方法是使用this answer中指出的int
過載。
該解決方案的「幻數」 -ness一直困擾個人我一點點。但有你就可以說,否則就像一個bool
引用類型的方式:
public sealed class RefBool
{
public static implicit operator bool(RefBool value)
{
return value != null;
}
public static implicit operator RefBool(bool value)
{
return value ? RefBool.True : RefBool.False;
}
public static bool operator true(RefBool value)
{
return value != null;
}
public static bool operator false(RefBool value)
{
return value == null;
}
public static readonly RefBool True = new RefBool();
public static readonly RefBool False = null;
private RefBool()
{
}
}
現在,您的類可以是這樣的:
public class Syncer
{
private RefBool mIsSyncInProgress = false;
public void SyncData()
{
if (Interlocked.Exchange(ref mIsSyncInProgress, true))
{
return;
}
// Sync data...
// It is enough that one thread is syncing data
Interlocked.Exchange(ref mIsSyncInProgress, false);
}
}
我覺得這更容易在使用場所閱讀。我不覺得這個解決方案是完美的,因爲RefBool
類有點奇怪。
你應該注意到我用null
的真實狀態。這是爲了確保類型RefBool
的變量只能是true
或false
。如果我用了兩個不同的實例來表示true
和false
,然後RefBool
也可能是null
,這將是一個不確定的狀態。
這樣做的缺點是,ToString
不正確的工作(這就是爲什麼我沒有打擾覆蓋它)。
你嘗試過這麼遠嗎? – ArgusMagnus
我寫的代碼不是線程安全的 – Uros
不熟悉C#中的原子操作,但是'Interlocked.Exchange'? https://msdn.microsoft.com/en-us/library/bb337971(v=vs.110).aspx – chris