【问题标题】:What is this C# code usage concept called? And how does it work?这个 C# 代码使用概念叫什么?它是如何工作的?
【发布时间】:2015-10-19 07:04:23
【问题描述】:

我正在查看有关 RegisterWaitForSingleObject HERE 的 MSDN 并在示例中找到了这种用法 -

    ti.Handle = ThreadPool.RegisterWaitForSingleObject(
            ev,
            new WaitOrTimerCallback(WaitProc),
            ti,
            1000,
            false
        );

WaitProc 是一个方法——

    public static void WaitProc(object state, bool timedOut)
    {
     //Code
    }

我还通过将 WaitProc 方法替换为与此类似的方法找到了相同的示例 -

    ti.Handle = ThreadPool.RegisterWaitForSingleObject(
            ev,
            (state, timedOut) => {
            //code blah blah
            //manipulate state
            //manipulate timedOut
            }
            ti,
            1000,
            false
        );

这里我假设RegisterWaitForSingleObject 方法需要WaitOrTimerCallback 方法,编译器理解这一点并将(state, timedOut) 视为方法,因此可以在调用本身中使用变量。

这个概念叫什么?

它是如何工作的?

【问题讨论】:

  • 这称为lambda expression
  • 它被称为 lambda 表达式,如果你不熟悉它,你可能应该先检查匿名方法以很好地掌握语法,然后检查 lambdas

标签: c# multithreading task-parallel-library threadpool


【解决方案1】:

这个概念叫什么?

它是如何工作的?

它被称为Lambda Expression。编译器获取表达式并将其转换为您的命名方法,同时为您省去每次实际定义与委托签名匹配的命名方法的麻烦。

使用TryRoslyn,这是您的委托编译成的内容(在新的 Roslyn 编译器上):

private sealed class <>c
{
    public static readonly C.<>c <>9;
    public static WaitOrTimerCallback <>9__0_0;
    static <>c()
    {
        // Note: this type is marked as 'beforefieldinit'.
        C.<>c.<>9 = new C.<>c();
    }
    internal void <M>b__0_0(object state, bool timedOut)
    {
    }
}

public void M()
{
    Mutex mutex = new Mutex();
    WaitHandle arg_2E_0 = mutex;
    WaitOrTimerCallback arg_2E_1;
    if (arg_2E_1 = C.<>c.<>9__0_0 == null)
    {
        arg_2E_1 = C.<>c.<>9__0_0 = new WaitOrTimerCallback(C.<>c.<>9.<M>b__0_0);
    }
    RegisteredWaitHandle registeredWaitHandle = 
        ThreadPool.RegisterWaitForSingleObject(arg_2E_0, arg_2E_1, null, 1000, false);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-18
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多