伪码:
class A
{
Dictionary<string, object> dic = new Dictionary<string, object>();
public Do()
{
some_a.SomeEvent += (s, e) =>
{
dic["some_string"] = new object();
};
dic["some_other_string"] = new object();
}
}
这样安全吗?如果两个字典操作都在同一个线程上。他们也是吗?
编辑在我的情况下,事件在与Do
相同的线程中触发,因此它是安全的。
答案 0 :(得分:4)
在调用事件的线程上发生事件(通常)。所以我们实际上不能完全评论,因为你没有显示导致调用事件的代码!
严格来说,事件可能在任何线程上 - 或者因为随机线程正在调用OnSomeEvent
(或者触发器是什么),或者OnSomeEvent
实现选择使用{{1}由于某种原因,但这不太可能。
最终,它归结为:是否有理由认为此代码中涉及多个线程。
但是:绝对并非如此:不,没有什么能 make 该事件会自动发生在订阅它的线程上。事件订阅只是一个对象+方法对;订阅中没有提名任何主题。
答案 1 :(得分:3)
事件处理程序中的代码将在引发事件的线程上执行。
class AsyncWorker
{
public void BeginWork()
{
new TaskFactory().StartNew(() => RaiseMyEvent());
}
public event EventHandler MyEvent;
private void RaiseMyEvent()
{
var myEvent = MyEvent;
if(myEvent != null)
myEvent(EventArgs.Empty);
}
}
var worker = new AsyncWorker();
worker.MyEvent += (s, e) =>
{
/* I will be executed on the thread
started by the TaskFactory */
};
worker.BeginWork();
答案 2 :(得分:1)
除非你在另一个线程中专门启动事件处理程序,否则这两个操作确实会在同一个线程上运行(假设一个线程应用程序)。