目前,我有一个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。
答案 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.
}