【问题标题】:WebClient GET/POST without blocking UIWebClient GET/POST 不阻塞 UI
【发布时间】:2014-12-01 22:29:54
【问题描述】:

我想发出非阻塞的 GET 和 POST 请求。我已经设法用BackgroundWorker 解决了它,但我需要你的帮助才能使用任务来实现它。

public Task<string> Post(Uri uri, string data)
{
    return _webClient.UploadStringTaskAsync(uri, data);
}

public Task<string> Get(Uri uri)
{
    return _webClient.DownloadStringTaskAsync(uri);
}

我需要按顺序运行请求。实现这一点的正确方法是什么?用asyncawait 标记方法?使用Task.WaitAll()等待每个任务?

我所追求的一个例子:

Task<string> loginTask = Post("login", data);
// wait for webrequest to complete and make use of response string

// use data from first request in a new request:
Task<string> someOtherRequest = Get("details");

【问题讨论】:

  • 您所追求的示例无法编译。 Post 方法的第一个参数是一个 Uri,但您传递的是一个字符串。
  • @Zack 这只是为了给你一个想法。做一个new Uri(str)
  • 如果您希望任何人花时间帮助您,您需要付出一些努力来创建一个好的示例。 :\
  • 你没有使用 HttpClient 和 async/await 有什么原因吗?

标签: c# winforms asynchronous


【解决方案1】:

你可以使用await Task.Run():

await Task.Run(()=> { Run_UI_Blocking_Function(); });

例如:

Post()函数中,可以添加:

await Task.Run(()=> { PostString = Post(new Uri("url"), "data"); }); 

在'Get()'函数中,你可以添加这个:

await Task.Run(()=> { GetString = Get(new Uri("url")); }); 

您只需将async 添加到您的调用函数中。这是一个完整的示例:

private async void btn_PostData_Click(object sender, EventArgs e)
{
    await Task.Run(()=> { PostString = Post(new Uri("url"), "data"); }); 
}

希望这会有所帮助。真的很短很甜。

【讨论】:

  • 这看起来很乱,尤其是当已经为异步连接了一个 HttpClient 时。
  • 它异步下载,但不会阻止其余代码阻塞 UI 线程。他没有发布该代码,它可能会做很多其他事情。这解决了它。
  • 是的,但它很乱。绝对不会把它归类为短而甜的。如果您知道 HttpClient 的做法,并更新您的答案以表明这一点,我会给您一个赞成票!
  • 也许它很乱,但从我的角度来看,这是一个简短而甜蜜的解决方案。 :-) 我还没有尝试过 HttpClient 异步方法。您介意发布一个示例,以便我们双方都可以向您学习吗?
【解决方案2】:

您需要将方法标记为异步,并等待结果。

public async Task<string> Get(Uri uri)
        {
        return await _webClient.DownloadStringTaskAsync(uri);
        }

您还可以安装 Microsoft HttpClient library,它已经为异步调用提供了管道,并且可能更轻一些。

【讨论】:

  • 嘿!我知道,但我完全忘记了!你说得对,我的方法和你的相比肯定是乱七八糟的。 +1
猜你喜欢
  • 2011-08-15
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多