这个演员对IDisposable是否正确?

时间:2014-06-24 17:54:31

标签: c# lambda task-parallel-library

在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。我读错了吗?

2 个答案:

答案 0 :(得分:7)

参数selfTimer调用委托(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

时,会创建一个委托