为什么Task实现IAsyncResult,但不包含AsyncWaitHandle成员?

时间:2014-03-04 14:09:04

标签: c# oop interface task iasyncresult

也许这是一个愚蠢的问题。

Task类以这种方式声明:

public class Task : IThreadPoolWorkItem, IAsyncResult, IDisposable

IAsyncResult接口声明如下:

public interface IAsyncResult
{
    object AsyncState { get; }
    WaitHandle AsyncWaitHandle { get; }
    bool CompletedSynchronously { get; }
    bool IsCompleted { get; }
}

AsyncWaitHandle类或实例中不存在成员Task

此代码:

System.Threading.Tasks.Task t = new System.Threading.Tasks.Task(() => { }); 
t.AsyncWaitHandle.ToString(); 

引发此编译错误:

  

错误1'System.Threading.Tasks.Task'不包含定义   对于'AsyncWaitHandle'而没有扩展方法'AsyncWaitHandle'   接受'System.Threading.Tasks.Task'类型的第一个参数可以   找到(你错过了使用指令或汇编引用吗?)

然而,这不仅编译:

System.IAsyncResult t = new System.Threading.Tasks.Task(() => { }); 
t.AsyncWaitHandle.ToString(); 

但也有效,因为会员存在。这巫术是什么?

这是一个编译技巧还是以另一种方式隐藏?

干杯。

2 个答案:

答案 0 :(得分:6)

Task明确地实现了IAsyncResult,因此您必须先进行投射:

System.Threading.Tasks.Task t = new System.Threading.Tasks.Task(() => { }); 
((IAsyncResult)t).AsyncWaitHandle.ToString()

显式实现定义如下:

public class Task : IAsyncResult
{
    WaitHandle IAsyncResult.AsyncWaitHandle
    {
        get { ... }
    }
}

答案 1 :(得分:2)

msdn docs很好地总结了它。

http://msdn.microsoft.com/en-us/library/ms173157.aspx

  

类成员IControl.Paint只能通过IControl获得   接口和ISurface.Paint只能通过ISurface获得。都   方法实现是分开的,也不是直接可用的   在课堂上。

interface IControl
{
    void Paint();
}
interface ISurface
{
    void Paint();
}
class SampleClass : IControl, ISurface
{
    void IControl.Paint()
    {
        System.Console.WriteLine("IControl.Paint");
    }
    void ISurface.Paint()
    {
        System.Console.WriteLine("ISurface.Paint");
    }
}

这里要说明的是显式接口实现是私有的,并且与编译器魔法绑定。