【问题标题】:Delegates in Threads and Anonymous methods - Update controls in new Thread线程中的委托和匿名方法 - 更新新线程中的控件
【发布时间】:2012-01-18 06:27:24
【问题描述】:

我在我的窗口窗体中使用了多线程。以下是我的课。 我的设计器中有一个标签控件,在新创建的线程下我正在更新它的文本属性。

以下是我将函数“UpdateLabel”封装在委托“Del”中的情况。 而且效果很好。

public partial class DynamicType : Form
    {
        delegate void Del(String x);

        public DynamicType()
        {
            InitializeComponent();
        }

        private void DynamicType_Load(object sender, EventArgs e)
        {
            System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(StartThread));
            t.Start();
        }

        private void StartThread()
        {
            this.Invoke(new Del(UpdateLabel), new object[] { "Hi" });
        }

        private void UpdateLabel(String str)
        {
            label1.Text = str;
        }
    }

我还有一个名为匿名方法的案例。实施匿名方法后 在以下方法中。以下是定义。

private void StartThread()
        {
            UpdateLabel("Hi");
        }



private void UpdateLabel(String str)
        {
            Del Label = delegate(String k)
             {
                 label1.Text = k;

             };
            Label("hi");
        }

跨线程操作无效:控件“label1”从创建它的线程以外的线程访问。

我的查询是在前一种情况下,我使用了委托,它工作正常,在匿名方法的情况下,我通过直接实例化委托删除了额外的函数,并尝试更新标签控件文本属性,结果崩溃为上文提到的。原因?

【问题讨论】:

    标签: c# multithreading c#-4.0 delegates


    【解决方案1】:

    在第一个示例中,您在 UI 线程中调用标签更新(通过Form.Invoke)。这是正确且有效的:

    this.Invoke(new Del(UpdateLabel), new object[] { "Hi" });
    

    在第二个示例中,您将在后台线程中创建一个委托并在后台线程中启动该委托。这不起作用,因为后台线程不允许更新 UI:

    Del Label = delegate(String k) { label1.Text = k; }; 
    Label("hi");   // runs in the same thread
    

    要解决这个问题,你必须使用this.Invoke 在 UI 线程中执行委托:

    Del Label = delegate(String k) { label1.Text = k; }; 
    this.Invoke(Label, new object[] {"hi"});   // runs in the UI thread
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-01
      • 2015-07-05
      • 2011-07-01
      • 1970-01-01
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多