c#events:在哪个线程上

时间:2012-08-17 10:36:13

标签: c# events thread-safety

伪码:

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相同的线程中触发,因此它是安全的。

3 个答案:

答案 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)

除非你在另一个线程中专门启动事件处理程序,否则这两个操作确实会在同一个线程上运行(假设一个线程应用程序)。