在MSFT的Task-based Asynchronous Pattern whitepaper中,第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表达式,则自己“转到”TimerCallback,它不会实现IDisposable
。我读错了吗?
答案 0 :(得分:7)
参数self
是Timer
调用委托(lambda)时传递的参数。根据MSDN,该代理的类型为TimerCallback
:
public delegate void TimerCallback(Object state)
当你没有在Timer构造函数中给出状态时,它使用Timer实例本身作为状态:
如果要将Timer对象本身用作状态对象,请调用此构造函数。
所以自我将成为Timer的实例,可以安全地转换为IDisposable。
虽然参数类型为object
,但这意味着它必须是object
的子类,可以是.NET中的任何类型。
答案 1 :(得分:0)
不,self是Timer对象。代码:
self =>
{
((IDisposable)self).Dispose(); //<--this is the line in question
tcs.TrySetResult(DateTimeOffset.UtcNow);
}
遵循以下格式:
(explicitly-typed-parameter-list)=> { statements }
当输入参数的类型为Timer
时,会创建一个委托