I've added a WCF service reference to my .NET 4.5 app, using the default "Generate task-based operations" option under "Allow Generation of asynchronous operations." I'm calling the service from an async method of my own, sort of like so:
public async Task<SomeData> GetDataAsync()
{
var client = new MyServiceClient();
var result = await client.GetSomeDataAsync();
return result;
}
The await client.GetSomeDataAsync()
never completes (a breakpoint on the return statement never gets hit) and I don't get a time out or any other error, no exception is thrown, nothing. Fiddler shows that the client sent the request and the service responded almost instantly with the expected data, so the problem is on my side of the fence somehow.
If I switch to the synchronous version instead
var result = client.GetSomeData();
The call returns as expected.
What am I doing wrong?
My chest hairs are tingling, Mr. T. I strongly suspect that further up your (client-side) call stack, you have some code that is calling Task<T>.Result
or Task.Wait
, which significantly increases the possibility of a deadlock (as I explain on my blog).
By default, when you await
a Task
, the await
will capture a "context" and use that to resume the async
method. If this is a context like a UI thread context, and then the code blocks the UI thread (i.e., calling Result
or Wait
), then the async
method cannot resume on that UI thread.
I pity the fool who would attempt to mix synchronous and asynchronous code. Just use async
all the way (as I describe in an MSDN article).
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With