gpt4 book ai didi

c# - 为什么 Await 之后的代码不在 UI 线程上运行?

转载 作者:太空宇宙 更新时间:2023-11-03 17:49:36 25 4
gpt4 key购买 nike

我过去曾使用委托(delegate)来使用线程中正在处理的值更新当前 UI(例如文本框)。我假设 asyncawait为你处理了这件事。

当我运行下面的代码时 - 当按下按钮时启动一个新任务,每 100 毫秒最多计数 100 个。计数应显示在 UI 上,但我得到了 targetInvocationException:

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
textBox1.Text = "Press button";
}

private async void button1_Click(object sender, EventArgs e)
{
await Task1();
}

private Task Task1()
{
return Task.Factory.StartNew(() => CountMethod());
}

private void CountMethod()
{
for (int i = 0; i < 100; i++)
{
Task.Delay(100).Wait();
//Console.WriteLine(i.ToString());
textBox1.Text = i.ToString();
}
}
}

最佳答案

问题是您正在使用线程池线程来访问 UI。您正在使用 Task.Factory.StartNew 来执行此操作方法。

以下是您可以解决的方法:

private async Task Task1()
{
for (int i = 0; i < 100; i++)
{
await Task.Delay(100);

textBox1.Text = i.ToString();
}
}
await将捕获当前 SynchronizationContext 这样在异步等待完成后,后面的代码就会在 UI 线程上执行。这是真的,因为 await由 UI 线程调用(在我的示例中)。

在您当前的代码中, await在线程池线程上调用。在这种情况下,当前 SynchronizationContext为空,因此异步等待之后的代码也将在线程池线程上执行。

关于c# - 为什么 Await 之后的代码不在 UI 线程上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36211467/

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