采用以下代码,在多线程环境中会发生什么:
static Dictionary<string,string> _events = new Dictionary<string,string>();
public static Dictionary<string,string> Events { get { return _events;} }
public static void ResetDictionary()
{
_events = new Dictionary<string,string>();
}
在多线程环境中,可以通过不同的线程同时访问此方法和属性。
将新对象分配给可在不同线程中访问的静态变量是否安全?可能出现什么问题?
有什么时候事件可以为空吗?如果2个线程同时调用Events
和ResetDictionary()
。
答案 0 :(得分:13)
将新对象分配给可在不同线程中访问的静态变量是否安全?
基本上,是的。从某种意义上说,该财产永远不会无效或null
。
可能出现什么问题?
在另一个线程重置后,读取线程可以继续使用旧字典。这有多糟糕取决于你的程序逻辑和要求。
答案 1 :(得分:0)
如果你想控制多线程环境中的所有东西,你必须使用一个可以被所有踏板访问的标志,并控制你在字典上使用的方法!
// the dictionary
static Dictionary<string, string> _events = new Dictionary<string, string>();
// public boolean
static bool isIdle = true;
// metod that a thread calls
bool doSomthingToDictionary()
{
// if another thread is using this method do nothing,
// just return false. (the thread will get false and try another time!)
if (!isIdle) return false;
// if it is Idle then:
isIdle = false;
ResetDictionary(); // do anything to your dictionary here
isIdle = true;
return true;
}
另一件事!您可以使用Invoke方法确保当一个线程正在操作变量或在另一个线程中调用函数时,其他线程将不会!看到链接:
Cleanest Way to Invoke Cross-Thread Events