此强制转换为 IDisposable 是否正确
本文关键字:是否 IDisposable 转换 | 更新日期: 2023-09-27 18:10:11
在MSFT的基于任务的异步模式白皮书的第11页中,Stephen Toub有以下代码说明了围绕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
是Timer
调用委托(lambda(时传递的参数。根据 MSDN,此委托的类型为 TimerCallback
:
public delegate void TimerCallback(Object state)
当你不在 Timer 构造函数中给出状态时,它使用 Timer 实例本身作为状态:
如果要将 Timer 对象本身用作状态对象,请调用此构造函数。
因此,self 将是计时器的实例,可以安全地转换为 IDisposable。尽管参数类型object
但这意味着它必须是 object
的子类,可以是 .NET 中的任何类型。
不,self 是 Timer 对象。代码:
self =>
{
((IDisposable)self).Dispose(); //<--this is the line in question
tcs.TrySetResult(DateTimeOffset.UtcNow);
}
请遵循以下格式:
(explicitly-typed-parameter-list)=> { statements }
这将创建一个委托,而输入参数的类型是计时器