【问题标题】:How to apply async/await for event based function using webservice C#?如何使用 webservice C# 为基于事件的函数应用 async/await?
【发布时间】:2019-08-26 19:21:17
【问题描述】:

我正在尝试使用网络服务从第三方调用数据,加载数据需要很长时间,所以我需要应用 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";
        }
    }

【问题讨论】:

  • “in .cs”是什么意思?这根本没有任何意义。 .cs 是 C# 代码文件的扩展名。它可以在任何.Net源代码项目中找到
  • 您的客户端代码是 WinForms 还是 WebForms?有很大的不同。
  • 我正在使用网络表单

标签: c# asp.net async-await


【解决方案1】:

使用 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。它会使用更多的资源,而且会更慢。

【讨论】:

    【解决方案2】:

    您需要使您的 btnClaim_Click 方法异步无效,然后等待 GetSuggestedItemsFromService,它应该返回一个任务。仅将 async void 用于事件处理程序。您的 .cs 代码应如下所示:

    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
    

    此外,如果它实际上是异步的,则约定是仅调用异步方法。因此,我建议将 SaveAndGetSuggestedItemAsync() 重命名为 SaveAndGetSuggestedItem()(它没有 async 关键字)。

    【讨论】:

    • 不要在 ASP.NET 应用程序中使用 Task.Run。它会使用更多的资源,而且会更慢。
    • 丢失 Task.Run()。多余的,甚至有点害处。 suggestedItems = await SaveAndGetSuggestedItemAsync() 就够了。
    • 这将是 WinForms 的有效答案,但我认为它甚至不适用于 WebForms (aspx)。
    猜你喜欢
    • 2020-08-01
    • 2018-08-16
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2018-10-09
    相关资源
    最近更新 更多