c# - 这个 C# 代码使用概念叫什么?它是如何工作的?

标签 c# multithreading task-parallel-library threadpool

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

    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) 视为方法,因此变量可以在调用本身中使用。

这个概念叫什么?

它是如何工作的?

最佳答案

What is this concept called?

And how does it work?

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

使用 TryRoslyn ,这就是您的委托(delegate)编译成的内容(在新的 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);
}

关于c# - 这个 C# 代码使用概念叫什么?它是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31681148/

相关文章:

c# - 线程安全的缓存枚举器-使用yield锁定

c# - 即使在 Asp.Net 流程中使用 ConfigureAwait(false) 后也会出现死锁

C# - 检查给定日期是否是一个月的第五周?

c# - 如何比较两个base64字符串?

java - 多线程和 Google App Engine Servlet

java - 录制音频时运行其他进程

c# - 如何实现高效的 WhenEach 流式传输任务结果的 IAsyncEnumerable?

c# - 使用 TPL 时不会引发异常

C# 互操作 : excel process not exiting after adding new worksheet to existing file

c# - 如何同时运行两个或多个sql查询?