【问题标题】:Need advice on thread safety需要有关线程安全的建议
【发布时间】:2011-12-06 18:08:05
【问题描述】:

这样写代码安全吗?

        var form = new Form();

        Action callback = 
            () =>
                {
                    // do something 1
                };

        ThreadPool.QueueUserWorkItem(
            args =>
                {
                    // do something 2
                    form.BeginInvoke(callback);
                });

UPD 我担心访问“表单”变量的安全性。我从后台线程使用 BeginInvoke 方法;我可以确定在此之前不会有任何读/写重新排序吗? (从后台线程的角度来看,这可能会使“表单”变量处于不一致的状态)

【问题讨论】:

    标签: c# .net multithreading thread-safety clr


    【解决方案1】:

    是的,看起来不错。变量form 将被捕获,只要线程池上的作业执行时它不是null,它应该可以工作。

    但是你遗漏了很多细节,我假设这段代码都是来自 1 个方法。

    // do something 1 可以访问 GUI,// do something 2 不能。

    【讨论】:

      【解决方案2】:
      ThreadPool.QueueUserWorkItem(
      args =>
      {
          // do something 2
          form.BeginInvoke(x);
      });
      

      这里实际发生的是编译器为您创建了一个全新的类,其中有一个成员变量保存您的Form 实例。这个类是新的,然后传递给ThreadPool.QueueUserWorkItem()。所以是的,它是线程安全的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-08
        相关资源
        最近更新 更多