在 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/