gpt4 book ai didi

c# - 为什么延迟任务没有完全执行或阻塞 UI?

转载 作者:行者123 更新时间:2023-11-30 21:37:03 26 4
gpt4 key购买 nike

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

关于c# - 为什么延迟任务没有完全执行或阻塞 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47652393/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com