c# - 如何使用 webservice C# 为基于事件的函数应用 async/await?
问题描述
我正在尝试使用 Web 服务从第三方调用数据,这将需要很长时间才能加载数据,因此我需要将async/await应用于该方法,我在.cs中调用该方法,我是使用如下所示,当我尝试使用“Void”而不是“Task”时,如果我使用 Task 事件不会触发,加载将需要很长时间。
[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;
}
在.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";
}
}
解决方案
使用 ASP.NET Web 窗体,您必须将异步代码注册为页面任务:
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;
}
}
看看这篇文章:
不要Task.Run
在 ASP.NET 应用程序中使用。它将使用更多资源并且速度会更慢。
推荐阅读
- python - django-filters 与 Django 2.1 的兼容性问题
- regex - 仅当存在另一个元素时如何将元素放入正则表达式
- c# - join 子句中的表达式之一的类型不正确。类型推断失败
- python - 用于分隔 Excel 工作表的多个数据框列表
- algorithm - 有没有一种有效的方法来计算比特流中 1 的密度?
- sql - 将数据从 SQL 输出导出到 csv 时出错
- javascript - 是否有任何 JS 智能 json 模式验证器,比如 Joi,但有动态自定义错误?
- ios - FUIEmailAuth 未声明
- sql - 确定开始时间和结束时间之间的每个小时
- c# - 比较 2 个列表的 UnorderedEquals 方法在布尔值上失败