【发布时间】:2014-02-08 15:09:54
【问题描述】:
当我调用BeginExecuteReader (SQL) 时,它是否使用 IO 完成端口?是什么让它成为异步的?我应该从 Begin[Operation]() 还是从 IAsyncResult 构造函数的包装器调用它?
【问题讨论】:
标签: c# sql wcf asynchronous io
当我调用BeginExecuteReader (SQL) 时,它是否使用 IO 完成端口?是什么让它成为异步的?我应该从 Begin[Operation]() 还是从 IAsyncResult 构造函数的包装器调用它?
【问题讨论】:
标签: c# sql wcf asynchronous io
它是否使用 IO 完成端口
也许,但这是原生 SQL 客户端实现中的一个实现细节。
请记住 SQL Server ADO.NET 调用(本地)本机 SQL Server 客户端,该客户端将执行与服务器的通信。
是什么让它成为异步的?
它的实现。有不止一种方法可以做到这一点,从伪造它的方法(使用专用工作线程执行阻塞操作)到 IO 完成端口和其他“真正的”异步 API。
我应该从哪里称呼它?
只要适合您的设计。
对于 IAsyncResult 构造函数?
如何使用异步 API(回调传递给 BeginExecuteReader,轮询返回的 IAsyncResult 的 IsComplete,等待 IAsyncResult,使用反应式扩展转换为 Task 和 TaskFactory.FromAsync Observable.FromAsyncPattern 或其他)再次成为您的代码设计的一部分。
有太多的可能性可以提供任何形式的指导。
【讨论】:
方法是否使用 IO Completion Ports 取决于实现。
如果在工作完成之前返回,则调用是异步的。显然这也取决于实现。
使用它的标准方法是
{
...
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 不必手动捕获状态,因此您可以像使用它一样
var ar = fs.BeginRead(data, 0, 100, result =>
{
int numberOfBytesRead = fs.EndRead(result);
// do something with data
}, null);
【讨论】: