我在c#中输入其他人的代码库作为以前的c ++编码器。在他的所有代码中,我都找到了如下所示的片段:
MethodInvoker invoker = new MethodInvoker
(delegate()
{
...
}
);
try
{
this.Invoke(invoker);
}
catch (Exception x)
{
...
}
我的问题是:有没有理由使用delegate
然后使用try-catch?第三到第五行的花括号内的代码不仅可以放在try catch中吗? c#还有一些细微差别我还不知道吗?
答案 0 :(得分:5)
这不只是调用委托,而是将其传递给名为Invoke
的方法。
您正在使用的UI框架/环境的细微差别。例如,在WinForms中,只有一个GUI线程可以更改UI控件。州。如果要从其他某个线程更改控件的状态,则需要调用Invoke方法并传递委托,就像在示例中一样。调用Invoke
基本上意味着"在GUI线程上运行此委托"。
请参阅以下问题:How to update the GUI from another thread in C#? Invoke in Windows Forms
和Control.Invoke文档: http://msdn.microsoft.com/en-us/library/a1hetckb.aspx
答案 1 :(得分:0)
您在此处所做的是defining a simple anonymous method
,稍后会在winform's Control thread
上调用
MethodInvoker invoker = new MethodInvoker
(delegate()
{
...
}
);
您接下来要做的是匿名方法的the execution
try
{
this.Invoke(invoker);
}
catch (Exception x)
{
...
}
Can the code inside the curly braces on the third to fifth lines not just be placed inside that try catch?
是的,你可以做这样的事情(MethodInvoker)
try
{
this.Invoke((MethodInvoker)delegate()
{
//
}
));
}
catch (Exception x)
{
...
}