事件,C#中的操作-在线程上下文中

本文关键字:线程 上下文 事件 操作 | 更新日期: 2023-09-27 18:23:37

我正在库中调用一个方法"Foo(object s,Action Action)"。由于函数本身涉及一定的执行时间,我使用CountDownEvents以在函数完成工作时通知我。

类似

countdownEvent.Reset();

try
 {
     Foo(obj, ()=> countdownEvent.Signal());
 }
 catch(Exception e)
 {
    countdownEvent.Signal();
 }
 countdownEvent.Wait();

我不理解的部分是

  1. ()=>countdownEvent.Signal()是什么意思?"()=>"特别代表什么
  2. 为什么方法签名没有写入Foo(对象s,CountDownEvent事件),它可以内部信号
  3. 我还没有真正理解Action类。在谷歌上搜索了一点,但就是找不到一些超级简单的例子开始

感谢您的帮助!

事件,C#中的操作-在线程上下文中

() => countdownEvent.Signal()是lambda表达式。

在这种特殊情况下,是某种匿名方法,它不接受参数,并且具有与countdownEvent.Signal()相同的返回类型。

  1. ()=>是lambda构造(请参见C#lambda(=>))。通过使用lambda表达式,可以编写可以作为参数传递或作为函数调用值返回的本地函数。Lambda表达式对于编写LINQ查询表达式特别有用。但是您可以使用它来编写任何类型的委托实现
  2. 您可以按照显示的方式指定相同的代码,但使用Action使其更加灵活。在第一种情况下,它是一个特定的函数,具有声明的行为。第二,它是一些活动,您可以根据程序的逻辑进行更改
  3. Action只是一个委托,它声明了一些动态行为。它封装了一个具有参数不返回值的方法。要引用具有参数返回值的方法,请改用泛型Func委托。当你的类期望一些行为,并且你希望你的类消费者自己声明这种行为时,它经常被使用

更新:根据VikciaR评论

  1. 这就是所谓的Lambda表达式。您可以将其视为简单的内联方法。()=>表示此方法没有参数。(字符串x)=>表示-一个参数
  2. 事件和lambda表达式是相似的概念(lambda表达式是从委托进化而来的)。请阅读此处
  3. MSDN是最好的:-)