C# 事件 : on which thread

标签 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 相同的线程中触发的,所以它是安全的。

最佳答案

事件发生(通常)在调用该事件的线程上。所以我们实际上不能完全评论,因为您没有显示导致事件被调用的代码!

严格来说,事件可以发生在任何线程上——因为随机线程正在调用 OnSomeEvent(或任何触发器),或者如果 OnSomeEvent 实现选择出于某种原因使用 BeginInvoke,但这不太可能。

最终,它归结为:是否有理由认为此代码中涉及多个线程。

但是:绝对不是这种情况:不,没有什么可以使该事件在订阅它的线程上自动发生。事件订阅只是一个对象+方法对;订阅中没有指定线程。

关于C# 事件 : on which thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12004189/

相关文章:

java - 调用 System.exit(0) 后应用程序继续运行 - Java

javascript - 动态创建的元素上的事件绑定(bind)?

java - 正确使用 volatile 关键字

java线程正确锁定变量

c# - 为什么 List<Task> 并不总是并行运行是有原因的?

c# - BackgroundWorker 还需要调用Invoke 吗?

c# - 你如何使用代码隐藏编写 gcAllowVeryLargeObjects

c# - C#事件系统对于单线程程序是确定性的吗?

C# Mongodb。所有文档的求和字段

c++ - C++中的线程安全队列