尝试与代表联系

时间:2014-06-21 10:03:00

标签: c# delegates try-catch

我在c#中输入其他人的代码库作为以前的c ++编码器。在他的所有代码中,我都找到了如下所示的片段:

MethodInvoker invoker = new MethodInvoker
      (delegate()
      {
        ...
      }
      );
try
{
   this.Invoke(invoker);
}
catch (Exception x)
{
  ...
}

我的问题是:有没有理由使用delegate然后使用try-catch?第三到第五行的花括号内的代码不仅可以放在try catch中吗? c#还有一些细微差别我还不知道吗?

2 个答案:

答案 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)
    {
      ...
    }