在.NET中,全局變量是在整個應用程序范圍內共享的變量。要在不同線程中使用全局變量,您需要確保對變量的訪問是線程安全的。這可以通過以下方法實現:
lock
關鍵字:lock
關鍵字可以確保在同一時間只有一個線程可以訪問共享資源。當您使用lock
時,其他嘗試訪問該資源的線程將被阻塞,直到當前線程釋放鎖。
private static readonly object _lockObject = new object();
private static int _globalVariable;
public static void UpdateGlobalVariable(int value)
{
lock (_lockObject)
{
_globalVariable = value;
}
}
public static int GetGlobalVariable()
{
lock (_lockObject)
{
return _globalVariable;
}
}
Monitor.Enter
和Monitor.Exit
方法:Monitor.Enter
方法用于獲取對象的監視器,而Monitor.Exit
方法用于釋放監視器。這些方法與lock
關鍵字類似,但提供了更多的靈活性。
private static readonly object _lockObject = new object();
private static int _globalVariable;
public static void UpdateGlobalVariable(int value)
{
Monitor.Enter(_lockObject);
try
{
_globalVariable = value;
}
finally
{
Monitor.Exit(_lockObject);
}
}
public static int GetGlobalVariable()
{
Monitor.Enter(_lockObject);
try
{
return _globalVariable;
}
finally
{
Monitor.Exit(_lockObject);
}
}
SemaphoreSlim
類:SemaphoreSlim
是一個輕量級的信號量,可以用來限制對共享資源的訪問。您可以根據需要設置信號量的初始計數和最大計數。
private static readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
private static int _globalVariable;
public static async Task UpdateGlobalVariableAsync(int value)
{
await _semaphore.WaitAsync();
try
{
_globalVariable = value;
}
finally
{
_semaphore.Release();
}
}
public static async Task<int> GetGlobalVariableAsync()
{
await _semaphore.WaitAsync();
try
{
return _globalVariable;
}
finally
{
_semaphore.Release();
}
}
請注意,這些方法僅適用于對全局變量的讀取和寫入操作。如果您需要對全局變量執行更復雜的操作,可能需要考慮使用其他同步機制,例如ReaderWriterLockSlim
類。