I have an asynchronous method that consumes a Web API action. It appears to be stuck in a loop. My reasoning for this is because if I put a break point on line 1 of the catc
Are you calling GetAll().Result
from an ASP.NET application? Since you have tagged MVC to this question, I assume so. If you do, then you are deadlocking yourself.
Say you calling web API like this.
public ActionResult Index()
{
var result = GetAll().Result;
return View();
}
The problem here is when the async call completes, it needs to continue on the original thread where it jumped out but you are blocking that thread by calling Result()
. Call to Result blocks and waits for async call to return and the async continuation waits for the ASP.NET thread to be available to continue. That is a dead lock.
Change your GetAll() like this.
public async Task> GetAll()
{
try
{
var response = await _client.GetAsync(
string.Format("{0}/api/document", _baseURI))
.ConfigureAwait(false);
// never hits line below
return await response.Content.ReadAsAsync()
as IEnumerable;
}
catch (Exception ex)
{
// handle exception
}
}
This indicates the context need not be preserved when the async call is complete and hence the continuation happens in a thread pool thread (not ASP.NET).
Better yet change the action method to public async Task
and await GetAll()
.
If you find this answer helpful, you must only thank Stephen Cleary.