为什么延迟任务未完全执行或阻止UI


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");
}

最新更新