EventHandler如何使用匿名方法工作?

时间:2014-05-01 22:24:14

标签: c# multithreading delegates eventhandler

目前,我有一个Windows窗体,它以异步方式从命名管道接收数据。为了避免“交叉线程操作无效:控制'myTextBox'从一个线程以外的线程访问”我使用的是匿名方法(参见http://www.codeproject.com/Articles/28485/Beginners-Guide-to-Threading-in-NET-Part-of-n):

            // Pass message back to calling form
            if (this.InvokeRequired)
            {
                // Create and invoke an anonymous method
                this.Invoke(new EventHandler(delegate
                {
                    myTextBox.Text = stringData;
                }));
            }
            else
                myTextBox.Text = stringData;

我的问题是,“新的EventHandler(委托”行)是做什么的?它是否创建了委托的委托?有人可以解释一下,我如何使用命名的委托来实现上述功能(只是为了帮助理解它)?TIA。

1 个答案:

答案 0 :(得分:3)

如果您有C ++背景,我会将委托描述为函数的简单指针。代表是.NET安全处理函数指针的方法。

要使用命名委托,首先必须创建一个处理事件的函数:

void MyHandler(object sender, EventArgs e)
{
    //Do what you want here
}

然后,对于您之前的代码,请将其更改为:

this.Invoke(new EventHandler(MyHandler), this, EventArgs.Empty);

如果我这样做,我会这样写,以避免重复代码。

EventHandler handler = (sender, e) => myTextBox.Test = stringData;

if (this.InvokeRequired)
{
    this.Invoke(handler, this, EventArgs.Empty);  //Invoke the handler on the UI thread
}
else
{
    handler(this, EventArgs.Empty); //Invoke the handler on this thread, since we're already on the UI thread.
}