【问题标题】:Issue with Async post in c#c#中的异步帖子问题
【发布时间】:2016-09-15 12:55:20
【问题描述】:

我的项目中有两个帖子,一个是异步的,第二个帖子是正常的,但依赖于帖子 1。

post 1 以字符串形式返回“success”。如果 post2 在 post 1 之前响应,这里会发生什么,那么它会给出错误。所以我想做的是等到帖子 1 在他的回复中返回“success”。

我不明白该怎么做。请建议。以下是我的发帖请求。

// 发布 1

startAsync("https://www.example.com", webClient, sPostData);

// 帖子 2 : 这取决于上面的帖子 1。我希望在回复之前完成帖子 1。

html = oClient.Post("https://example.com" + "?"+sPostParameter, "");

新编辑

 private async void startAsync(string url, ExtendedWebClient oExtendedWebClient, string sParam)
    {

        await CreateMultipleTasksAsync(url, oExtendedWebClient, sParam);

    }

private async Task CreateMultipleTasksAsync(string url, ExtendedWebClient oExtendedWebClient, string sParam)
        {

            try
            {
                Task<int> download1 = oExtendedWebClient.ProcessURLAsync(url, oExtendedWebClient, sParam);
                Task<int> download2 = oExtendedWebClient.ProcessURLAsync(url, oExtendedWebClient, sPostData);
                Task<int> download3 = oExtendedWebClient.ProcessURLAsync(url, oExtendedWebClient, sPostData);
                Task<int> download4 = oExtendedWebClient.ProcessURLAsync(url, oExtendedWebClient, sPostData); 
                Task<int> download5 = oExtendedWebClient.ProcessURLAsync(url, oExtendedWebClient, sPostData);
                // Await each task.
                int length1 = await download1;
                int length2 = await download2;
                int length3 = await download3;
                int length4 = await download4;
                int length5 = await download5;
            }
            catch (Exception ex)
            {
                ErrorLog.createLog("ex.StackTrace = " + ex.StackTrace + " ex.tostring = " + ex.ToString());
            }
}

 async Task<int> ProcessURLAsync(string url, ExtendedWebClient oExtendedWebClient, string sParam)
        {
            byte[] PostData = System.Text.Encoding.ASCII.GetBytes(sParam);

            var byteArray = await oExtendedWebClient.UploadDataTaskAsync(url, PostData);
            //DisplayResults(url, byteArray);
            return byteArray.Length;
        }   

我使用这样的 startAsync 方法 startAsync("https://www.example.com", webClient, sPostData);

这里我想等到这个结束执行

【问题讨论】:

  • 这正是await 所做的,它等待操作完成。这究竟是如何失败的?
  • 您好,感谢您的考虑。它不会在 await 等待并去执行下一行
  • 你能展示表达上述调用的完整代码吗?
  • @Karan 我们需要查看更多代码,方法是如何声明的等等......现在正在猜测
  • @Karan:您显示的代码不会产生您所描述的行为。与其模糊地描述整个代码的样子,不如展示一个完整的(和最小的)示例来说明问题。

标签: c# webclient


【解决方案1】:

如果您使用关键字 async,则在完成 async 之前不会触发其他事件。

MSDN 示例 帮助我很好地掌握了它的工作原理

完整链接披露MSDN

【讨论】:

    【解决方案2】:

    这可以使用Task.ContinueWith来完成

    你的代码看起来像

    Task<int> download1 = await oClient.ProcessURLAsync(url, 
                  oWebClient, 
                  sParam).ContinueWith(
                      downloadTask =>{
    
                          if (downloadTask.Result == "success"){
                              var html = oClient.Post(
                                  "https://example.com" + "?" + sPostParameter,
                                  "");
                          } else{
                              //wait
                          }
                      });
    

    【讨论】:

      【解决方案3】:

      既然我同意这应该已经可以等待下载1,您可以强制等待任务结果(因为您通过使用(已编辑和更正,sry)将其声明为任务int>:

      替换

      Task<int> download1 = oClient.ProcessURLAsync(url, oWebClient, sParam);
      int length1 = await download1;
      

      int length1 = await oClient.ProcessURLAsync(url, oWebClient, sParam).Result;
      

      或者,您可以使用以下命令强制等待:

      Task.WaitAll(download1);
      

      问候 康斯坦丁

      【讨论】:

      • @KoPoCabana:根本没有更正,这段代码仍在.Result 上调用await。如果await 是一个选项,为什么还要调用.Result?一般来说,使用.Result应该非常小心。
      猜你喜欢
      • 2023-03-06
      • 2021-05-24
      • 2017-12-26
      • 2021-03-04
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多