Reputation: 1489
I'm trying to call data from third-party using web-service and this will take a long time to load data so I need to apply async/await to that method, I'm calling that method in .cs, I'm using like below, when I tried with 'Void' instead of 'Task' it will take a long time to load if I use Task event will not fire.
[WebMethod]
public List<SuggestedItemsInput> SaveSuggestedItems(string emailbody, string OrderHeaderID)
{
List<SuggestedItemsInput> result = null;
//... passing header and neccesery things
request.AddParameter("application/text; charset=utf-8", strFinalEmail, ParameterType.RequestBody);
IRestResponse restResponse = client.Execute(request);
result = JsonConvert.DeserializeObject<List<SuggestedItemsInput>>(restResponse.Content);
//Save to database
if (dtProducts.Rows.Count >= 1)
dalPendingOrders.SaveSuggestedItems(dtProducts);
LogMessage("Suggested Items for " + OrderHeaderID + " : " + products.Products.Count);
return result;
}
in .cs
protected void btnClaim_Click(object sender, EventArgs e)
{
GetSuggestedItemsFromService();
}
private async void GetSuggestedItemsFromService()
{
List<SuggestedItemsInput> suggestedItems = await Task.Run(() => SaveAndGetSuggestedItemAsync());
ViewState["sItems"] = suggestedItems;
if (suggestedItems != null && suggestedItems.Count > 0)
{
GetSuggestedItems(Request["OrderRecordID"].ToString());
lblInfo.Text = string.Empty;
}
}
private List<SuggestedItemsInput> SaveAndGetSuggestedItemAsync()
{
OHDWebService OHDService = new OHDWebService();
List<SuggestedItemsInput> suggestedItemsList = OHDService.SaveSuggestedItems(hdnPlainBody.Value, hfdOrderRecordID.Value);
return suggestedItemsList;
}
private void GetSuggestedItems(string OrderRecordID)
{
dt = dalPendingOrders.GetSuggestedItems(OrderRecordID);
if (dt.Rows.Count > 0)
{
grdSuggestedItems.DataSource = dt;
grdSuggestedItems.DataBind();
}
else
{
lblInfo.Text = "No Data Found";
}
}
Upvotes: 1
Views: 192
Reputation: 14846
With ASP.NET Web Forms you have to register asynchronous code as a Page Task:
protected void btnClaim_Click(object sender, EventArgs e)
{
RegisterAsyncTask(GetSuggestedItemsFromService);
}
private async Task GetSuggestedItemsFromService()
{
List<SuggestedItemsInput> suggestedItems = await SaveAndGetSuggestedItemAsync();
ViewState["sItems"] = suggestedItems;
if (suggestedItems != null && suggestedItems.Count > 0)
{
GetSuggestedItems(Request["OrderRecordID"].ToString());
lblInfo.Text = string.Empty;
}
}
Check this article out:
Using Asynchronous Methods in ASP.NET 4.5
Don't use Task.Run
in ASP.NET applications. It will use more resources and it will be slower.
Upvotes: 4
Reputation: 8743
You will need to make your btnClaim_Click method async void, which will then await GetSuggestedItemsFromService, which should return a Task. Use async void only for event handlers. Your .cs Code should look like this:
protected async void btnClaim_Click(object sender, EventArgs e)
{
await GetSuggestedItemsFromService();
}
private async Task GetSuggestedItemsFromService()
{
List<SuggestedItemsInput> suggestedItems = await Task.Run(() => SaveAndGetSuggestedItemAsync());
ViewState["sItems"] = suggestedItems;
if (suggestedItems != null && suggestedItems.Count > 0)
{
GetSuggestedItems(Request["OrderRecordID"].ToString());
lblInfo.Text = string.Empty;
}
}
// Rest of your code
Moreover, the convetion is to call a method only Async if it's actually async. Hence I recommend renaming SaveAndGetSuggestedItemAsync() to SaveAndGetSuggestedItem() (it has no async keyword).
Upvotes: 1