首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IO完工港(IOCP)

IO完工港(IOCP)
EN

Stack Overflow用户
提问于 2014-01-19 13:14:20
回答 2查看 719关注 0票数 3

当我调用BeginExecuteReader (SQL)时,它是否使用IO完成端口?是什么使它成为异步的?是从Begin[Operation]()调用它还是从IAsyncResult构造函数的包装器调用它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-19 13:27:05

它是否使用IO完成端口?

也许,但这是本机SQL客户端实现中的一个实现细节。

请记住,server对本地Server客户端的ADO.NET调用将执行与服务器的通信。

是什么使它成为异步的?

它的实施。有不止一种方法可以做到这一点,从伪造它的方法(用专用的工作线程执行阻塞操作)到IO完成端口和其他“真正的”异步API。

我该从哪里开始叫它?

适合你设计的地方。

用于IAsyncResult构造函数吗?

如何使用异步API(传递给BeginExecuteReader的回调、轮询返回的IAsyncResultIsComplete、等待IAsyncResult、用TaskFactory.FromAsync转换为Task、使用Observable.FromAsyncPattern的反应性扩展或其他什么)再次成为代码设计的一部分。

有太多的可能性可以提供任何形式的指导。

票数 4
EN

Stack Overflow用户

发布于 2014-01-19 13:28:45

方法是否使用IO完成端口取决于实现。

如果调用在工作完成前返回,则调用是异步的。显然,这也取决于实现。

使用它的标准方法是

代码语言:javascript
复制
{
    ...
    var fs = new FileStream(...); // using FileStream as an example
    var data = new byte[100];
    var ar = fs.BeginRead(data, 0, 100, MyCallback, new object[] { fs, data });
    ...
    // you can check the IAsyncResult ar for completion,
    // or do some work that doesn't depend on the data
}

private void MyCallback(IAsyncResult ar)
{
    // AsyncState gets the last parameter from the call to BeginRead
    var fs = (FileStream)(((object[])ar.AsyncState)[0]);
    var data = (FileStream)(((object[])ar.AsyncState)[1]);

    int numberOfBytesRead = fs.EndRead(ar);
    // do something with data
}

当然,还可以使用lambda表达式作为回调。使用lambdas时,不需要手动捕获状态,所以您可以像这样使用它

代码语言:javascript
复制
var ar = fs.BeginRead(data, 0, 100, result => 
{
    int numberOfBytesRead = fs.EndRead(result);
    // do something with data
}, null);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21217213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档