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");
}
问题在这里:
private async void Test()
{
string response = await httpClient(token);
Console.WriteLine("response: " + response);
}
您做了一些async void
后立即删除了任何跟踪状态的能力。您的new Task(Test);
使用new Task(Action)
,该代码首先返回呼叫者(即在第一个不完整的await
)(在您的情况下:Task.Delay
)后立即报告完成。要做您想做的事,您应该真正使用Task.Run(Func<Task>)
API(或完全避免使用Task.Run
/Task.Start
,依赖于异步管道本身),使用private async Task Test()
方法。
您的活动处理程序可能是:
private async void button1_Click(object sender, EventArgs e)
{
Console.WriteLine("about to start task");
var t = Task.Run(Test);
Console.WriteLine("task started");
await t;
Console.WriteLine("task finished");
}
或避免额外的线程(如nkosi所述):
private async void button1_Click(object sender, EventArgs e)
{
Console.WriteLine("about to start task");
var t = Test();
Console.WriteLine("task started");
await t;
Console.WriteLine("task finished");
}