c# - 这对 IDisposable 是否正确?

标签 c# lambda task-parallel-library

在 MSFT 的 Task-based Asynchronous Pattern whitepaper ,在第 11 页,Stephen Toub 有以下代码说明了 Task 围绕 Timer 回调的包装。

public static Task<DateTimeOffset> Delay(int millisecondsTimeout)
{
    var tcs = new TaskCompletionSource<DateTimeOffset>();
    new Timer(self =>
    {
        ((IDisposable)self).Dispose();  //<--this is the line in question
        tcs.TrySetResult(DateTimeOffset.UtcNow);
    }).Change(millisecondsTimeout, -1);
    return tcs.Task;
}

在第 6 行,他将 self 转换为 IDisposable。如果我正确地阅读了这个 lambda 表达式,self 将“转到”TimerCallback。 ,它没有实现 IDisposable。我读错了吗?

最佳答案

参数 self 是当您的委托(delegate) (lambda) 被 Timer 调用时传递的参数。根据 MSDN,此委托(delegate)的类型为 TimerCallback:

public delegate void TimerCallback(Object state)

当您不在 Timer 构造函数中提供状态时,它使用 Timer 实例本身作为状态:

Call this constructor when you want to use the Timer object itself as the state object.

所以 self 将是 Timer 的实例,可以安全地转换为 IDisposable。 虽然参数的类型是 object 这意味着它必须是 object 的子类,它可以是 .NET 中的任何类型。

关于c# - 这对 IDisposable 是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24393242/

相关文章:

c# - 项目引用另一个项目的 obj 文件夹中的 dll - 有时编译有时不编译

c# - NUnit 锁定了我的可执行文件,因此我无法重新编译它

c++ - 在 unordered_map<vector<T>> 中使用 lambda 函数进行散列

c# - 以非阻塞方式调用 TaskCompletionSource.SetResult

c# - 如何在 Windows Phone 8 应用程序中修剪 mp4 视频

c# - 如何使用匿名方法动态订阅事件?

java - 如何在 groupingBy 操作中使用自定义收集器

android - java.lang.NoClassDefFoundError $$inlined$forEach$lambda$1 在 Kotlin

c# - Task.WaitAll() - 无参数

c# - 不同 DbContext 的并行执行比非并行版本慢