YAKOVM
YAKOVM

Reputation: 10153

IO Completion Ports (IOCP)

When I call BeginExecuteReader (SQL) does it use IO Completion Ports? What makes it to be asynchronous? Should I call it from Begin[Operation]() or from the wrapper for IAsyncResult constructor?

Upvotes: 3

Views: 802

Answers (2)

Dirk
Dirk

Reputation: 10958

Whether or not the method uses IO Completion Ports is up to the implementation.

The call is asynchronous if it returns before the work is completed. Obviously that's also up to the implementation.

The standard way to use it would be

{
    ...
    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
}

You could also use a lambda expression as for a callback of course. With lambdas the state doesn't have to be captured manually so you could use it like

var ar = fs.BeginRead(data, 0, 100, result => 
{
    int numberOfBytesRead = fs.EndRead(result);
    // do something with data
}, null);

Upvotes: 1

Richard
Richard

Reputation: 109005

does it use IO Completion Ports

Maybe, but that's an implementation detail deep in the native SQL Client's implementation.

Remember the SQL Server ADO.NET calls into the (local) native SQL Server client which will perform communication with the server.

What makes it to be async?

Its implementation. There is more than one way to do this, from approaches which fake it (perform blocking operations with a dedicated worker thread) through to IO Completion Ports and other "true" asynchronous APIs.

Where from should I call it ?

Wherever is right for your design.

for IAsyncResult constructor?

How you use the asynchronous APIs (callback passed to BeginExecuteReader, poll the returned IAsyncResult's IsComplete, wait on IAsyncResult, convert to a Task with TaskFactory.FromAsync, using the Reactive Extensions with Observable.FromAsyncPattern, or something else) is again part of the design of your code.

There are too many possibilities to give any form of guidance.

Upvotes: 4

Related Questions