首页 > 解决方案 > 如何使用 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";
        }
    }

标签: c#asp.netasync-await

解决方案


使用 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;
    }
}

看看这篇文章:

在 ASP.NET 4.5 中使用异步方法

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


推荐阅读