5

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

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”的定义,并且找不到接受“System.Threading.Tasks.Task”类型的第一个参数的扩展方法“AsyncWaitHandle”(您是否缺少使用指令还是程序集引用?)

但是,这不仅编译:

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

但也有效,因为该成员存在。这是什么法术?

这是编译器技巧还是以其他方式隐藏?

干杯。

4

2 回答 2

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 { ... }
    }
}
于 2014-03-04T14:11:38.057 回答
2

msdn 文档很好地总结了它。

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");
    }
}

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

于 2014-03-04T14:16:25.593 回答