Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 这个角色对IDisposable正确吗?_C#_Lambda_Task Parallel Library - Fatal编程技术网

C# 这个角色对IDisposable正确吗?

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()

在MSFT的第11页,Stephen Toub有下面的代码说明了围绕计时器回调包装任务

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”不是保留字。它不会自动引用新计时器。那么,在这种语法中,是什么导致它引用计时器?它不在语法中,它是计时器的行为。