Skip to main content
 首页 » 编程设计

c#之如何使用 webservice C# 为基于事件的函数应用异步/等待

2024年01月29日24luoye11

我正在尝试从第三方使用网络服务调用数据,这将花费很长时间来加载数据,因此我需要应用async/await对于那个方法,我在 .cs 中调用那个方法,我正在使用如下所示,当我尝试使用“Void”而不是“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; 
    } 
} 

查看这篇文章:

Using Asynchronous Methods in ASP.NET 4.5

不要在 ASP.NET 应用程序中使用 Task.Run。它将使用更多资源并且速度会更慢。