【发布时间】:2017-12-05 11:21:18
【问题描述】:
private async Task<string> httpClient(CancellationToken cancelToken)
{
HttpClient hc = new HttpClient();
hc.Timeout = new TimeSpan(0, 0, 10);
//Task.Delay(5000).Wait(); using this one, it blocks the UI thread
//await Task.Delay(5000); using this one, it doesn't execute the task after delay
if (cancelToken.IsCancellationRequested)
{
return null;
}
HttpResponseMessage response = await hc.GetAsync(new Uri("http://google.com/"));
response.EnsureSuccessStatusCode();
string responseData = await response.Content.ReadAsStringAsync();
return responseData;
}
这是我的异步任务,我在尝试在其中使用延迟时遇到问题。我尝试了两种方法,似乎都导致任务出现问题。尝试研究但找不到解决我的问题的方法。任何帮助表示赞赏
其他部分代码:
private async void Test()
{
string response = await httpClient(token);
Console.WriteLine("response: " + response);
}
private void button1_Click(object sender, EventArgs e)
{
Task t = new Task(Test);
t.Start();
Console.WriteLine("task started");
t.Wait();
Console.WriteLine("task finished");
}
【问题讨论】:
-
Task.Delay(5000).Wait();- 是的,这会阻塞 UI 线程(如果它完成的话);不要那样做;至于await Task.Delay(5000);- 看起来应该可以工作 - 实际发生了什么? -
取消令牌是否超时?
-
@MarcGravell 我添加了代码的另一部分。当我单击 button1 时会发生什么情况,它会立即打印出“任务开始”和“任务完成”。
-
不要为每个请求创建一个新的 HttpClient,为所有请求保留一个对象(参考此处aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong)。此外,您应该将 cancelToken 传递给您等待的方法,将其传递给 GetAsync。
-
@gafs 这就是为什么我们不使用
async void:)
标签: c# multithreading asynchronous async-await task