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

标签 c# oop interface task iasyncresult

也许这是个愚蠢的问题。

Task 类是这样声明的:

public class Task : IThreadPoolWorkItem, IAsyncResult, IDisposable

IAsyncResult 接口(interface)声明如下:

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

引发此编译错误:

Error 1 'System.Threading.Tasks.Task' does not contain a definition for 'AsyncWaitHandle' and no extension method 'AsyncWaitHandle' accepting a first argument of type 'System.Threading.Tasks.Task' could be found (are you missing a using directive or an assembly reference?)

然而,这不仅编译:

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

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

这是编译器的把戏还是以其他方式隐藏了?

干杯。

最佳答案

Task 显式实现了 IAsyncResult,因此您必须先进行转换:

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

显式实现定义如下:

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

关于c# - 为什么 Task 实现了 IAsyncResult,但不包含 AsyncWaitHandle 成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22174209/

相关文章:

php - 依赖倒置和接口(interface)

delphi - 抽象与接口(interface) - 在 Delphi 中分离定义和实现

java - 空白的 final 字段 conn 可能尚未在非 final 成员上初始化

sorting - 在 Go 中,当使用多个 return 语句时,如何调用每个特定的 return 语句?

c# - 使用具有不同类型详细信息的主从 View

c# - Linq 帮助。 int.Contains 和 int == iqueryable 不起作用

java - 通过接口(interface)了解 Java 中的异常

iPhone iOS 如何创建交互式拖动、旋转、调整大小、删除 View 控件?

c# - Visual Studio express : free class diagram tool

c# - Entity Framework 忽略 NotMapped 属性