当我调用BeginExecuteReader (SQL)时,它是否使用IO完成端口?是什么使它成为异步的?是从Begin[Operation]()调用它还是从IAsyncResult构造函数的包装器调用它?
发布于 2014-01-19 13:27:05
它是否使用IO完成端口?
也许,但这是本机SQL客户端实现中的一个实现细节。
请记住,server对本地Server客户端的ADO.NET调用将执行与服务器的通信。
是什么使它成为异步的?
它的实施。有不止一种方法可以做到这一点,从伪造它的方法(用专用的工作线程执行阻塞操作)到IO完成端口和其他“真正的”异步API。
我该从哪里开始叫它?
适合你设计的地方。
用于IAsyncResult构造函数吗?
如何使用异步API(传递给BeginExecuteReader的回调、轮询返回的IAsyncResult的IsComplete、等待IAsyncResult、用TaskFactory.FromAsync转换为Task、使用Observable.FromAsyncPattern的反应性扩展或其他什么)再次成为代码设计的一部分。
有太多的可能性可以提供任何形式的指导。
发布于 2014-01-19 13:28:45
方法是否使用IO完成端口取决于实现。
如果调用在工作完成前返回,则调用是异步的。显然,这也取决于实现。
使用它的标准方法是
{
...
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);https://stackoverflow.com/questions/21217213
复制相似问题