我正在尝试充分了解 Windows 运行时,以便就我的雇主将我们现有的应用程序移植到它需要什么提出建议。我无法找到提供 API 工作原理技术概述的文档。
我所有的网络搜索似乎都将我引向了MSDN 上的 API 参考,它简洁到难以阅读的程度。它记录了 API 类和方法的正式签名,但似乎假设读者已经知道事物是如何组合在一起的。每个方法的目的通常只是描述为一个简洁的句子片段,用空格而不是 CamelCase 重述其名称,并且几乎完全没有关于类型声明中明显的限制、期望和不变量的进一步解释。(这与普通 Win32 API 参考文档中相当丰富的“备注”部分形成对比)。
显然,我不应该使用本文档来初步了解 API 的工作原理。我应该使用什么?
在 MSDN 中向上移动一个级别,有一个名为Concepts and Architecture的部分,以及一些听起来更有前途的编程概念和基础知识——但它们实际描述的是看似随机选择的相当专业的主题,当然不是我需要理解 API 参考。
是否有我需要购买和阅读的书本形式的官方文档?MSDN 之外的东西?我找不到的秘密 MSDN 链接?
我已经看到了这个没有得到任何真正答案的上一个问题,也许是因为它的措辞相当不透明,比如“本体”之类的 5 美元。为了更好地解释我在寻找什么,这里有一些问题示例,我希望我寻求的文档能告诉我以下问题的答案:
(请注意,这些只是示例。我的主要目标是找到一个能够回答这些和类似问题的规范,而不是获得这些特定示例的答案。)
Windows.Networking.Sockets.StreamSocket
有一个InputStream
type 的属性,Windows.Storage.Streams.IInputStream
我显然应该用它来从套接字读取。但唯一的方法IInputStream
是ReadAsync
读入IBuffer
, 并且IBuffer
是一个只声明容量和大小属性的接口。如何获取正在读取的实际字节?如果我IBuffer
自己实现,系统将如何将它们交付给我?经过数小时的沮丧点击和谷歌搜索,我初步得出结论,该接口是一个谎言——
IBuffer
不是任何人都可以实现的,而是ReadAsync
特别想要一个Windows.Storage.Streams.Buffer
(没有I
),不管它的类型声明说什么。然后看来我可以用来DataReader
从Buffer
. 真的是这样吗?
或者
嗯,它看起来
DataReader
有一个带 的构造函数IInputStream
,所以也许我可以Buffer
删掉中间人。但是,这似乎是错误的,因为DataReader
诸如 的方法ReadBytes
是同步的,并且据说 WinRT 中的所有 I/O 都是异步的;当然,声明的方法之一IInputStream
是。那么这是如何工作的呢?在更沮丧的谷歌搜索和点击之后:哦,有一种
LoadAsync
方法DataReader
可以做到……某事。根据 MSDN,它“从输入流中加载数据”,但使用它的约定是什么?我应该在构造之后立即调用它一次DataReader
,还是我可以多次调用它以DataReader
在下一次读取操作中重用它?内部是否DataReader
包含循环缓冲区?如果我尝试读取的字节数比已经异步读取的多,会发生什么?这些方法的超简洁文档ReadFoo
没有提到异常或错误条件;DataReader
或的类文档也没有IDataReader
。
或者
显然,应用程序可以是多线程的,因为受支持的 Win32 API包括类似的东西
InterlockedCompareExchange
,EnterCriticalSection
等等。但是似乎既不支持CreateThread
也不支持 RTL ,而且在 WinRT 类层次结构中的任何地方似乎都没有任何 Java-ish 类。如何开始一个新线程?_beginthreadex
Thread
或者
谈到异步 I/O ...我对异步 I/O 和完成延续的一般概念很满意,但是 WinRT 中的精确规则是什么,比如调用完成例程的线程是什么?如果它始终是我开始 I/O 操作的同一个线程(我希望!),我是否需要确保它不时进入某种警报等待,以便系统有机会在那里调用我的代码?
或者
维基百科声称“WinRT 本质上是一个基于 COM 的 API,尽管依赖于增强的 COM。” 这种“增强”究竟是什么?如果我遵循 COM 规则和约定,我是否会因为“增强”而面临被不同工作方式所困扰的风险?或者,相反,由于增强,我可以做一些更容易的事情吗?
或者
对异步回调如何工作的唯一描述使它看起来非常特定于实现语言——它在 C#/CLR、JavaScript 和 C++/CX 之间看起来完全不同。这里的 COM/ABI 级别实际发生了什么?特别是,由于 API 文档似乎假定“C++”表示“C++/CX”,如果我改用 WRL,异步 I/O 将如何工作?或者仅仅是
await
andthen
业务只是语言提供的糖,而真正的ABI 总是按照AsyncOperationWithProgressCompletedHandler
API 参考中描述的等等?但这是一个委托类型;就COM而言,这甚至具有明确定义的含义吗?