C# 这个角色对IDisposable正确吗?
在MSFT的第11页,Stephen Toub有下面的代码说明了围绕计时器回调包装任务C# 这个角色对IDisposable正确吗?,c#,lambda,task-parallel-library,C#,Lambda,Task Parallel Library,在MSFT的第11页,Stephen Toub有下面的代码说明了围绕计时器回调包装任务 public static Task<DateTimeOffset> Delay(int millisecondsTimeout) { var tcs = new TaskCompletionSource<DateTimeOffset>(); new Timer(self => { ((IDisposable)self).Dispose()
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;
}
公共静态任务延迟(int毫秒)
{
var tcs=new TaskCompletionSource();
新定时器(self=>
{
((IDisposable)self).Dispose();//参数self
是由计时器调用委托(lambda)时传递的参数。根据MSDN,此委托的类型为TimerCallback
:
public delegate void TimerCallback(Object state)
当您不在计时器构造函数中提供状态时,它将计时器实例本身用作状态:
当您希望将计时器对象本身用作状态对象时,请调用此构造函数
所以self将是Timer的实例,可以安全地将其铸造为IDisposable。
虽然参数的类型是对象
,但这意味着它必须是对象
的子类,该对象可以是.NET中的任何类型。当计时器
调用委托(lambda)时,会传递参数self
。根据MSDN,此委托的类型是TimerCallback
:
public delegate void TimerCallback(Object state)
当您不在计时器构造函数中提供状态时,它将计时器实例本身用作状态:
当您希望将计时器对象本身用作状态对象时,请调用此构造函数
所以self将是Timer的实例,可以安全地将其铸造为IDisposable。
尽管参数的类型是对象
,这意味着它必须是对象
的子类,可以是.NET中的任何类型。否,self是计时器对象。代码:
self =>
{
((IDisposable)self).Dispose(); //<--this is the line in question
tcs.TrySetResult(DateTimeOffset.UtcNow);
}
当输入参数的类型为Timer时,它会创建一个委托。否,self是Timer对象。代码:
self =>
{
((IDisposable)self).Dispose(); //<--this is the line in question
tcs.TrySetResult(DateTimeOffset.UtcNow);
}
它创建了一个委托,而输入参数的类型是Timer很好,谢谢。我知道self是这个委托的对象参数。但是我不明白为什么它是Timer。换句话说,self看起来应该只是某个对象,而不是Timer。谢谢。让我这样问:“self”不是保留字。它不会自动引用新的计时器。那么是什么在这个语法中导致它引用计时器呢?它不在语法中,它是计时器的行为。很好,谢谢。我知道self是这个委托的对象参数。但是我不明白为什么它是计时器。换句话说,self看起来应该只是某个对象,而不是计时器。谢谢。让我这样问:'“self”不是保留字。它不会自动引用新计时器。那么,在这种语法中,是什么导致它引用计时器?它不在语法中,它是计时器的行为。