此强制转换为 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 .我看错了吗?

此强制转换为 IDisposable 是否正确

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

这将创建一个委托,而输入参数的类型是计时器