gpt4 book ai didi

c# - 在 Task.Run 中使用 async/await 在 WinForms 上访问 UI 控件

转载 作者:IT王子 更新时间:2023-10-29 04:28:58 26 4
gpt4 key购买 nike

我在具有一个按钮和一个标签的 WinForms 应用程序中有以下代码:

using System;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

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

private async Task Run()
{
await Task.Run(async () => {
await File.AppendText("temp.dat").WriteAsync("a");
label1.Text = "test";
});
}
}
}

这是我正在处理的真实应用程序的简化版本。我的印象是,通过在我的 Task.Run 中使用 async/await,我可以设置 label1.Text 属性。但是,在运行这段代码时,我收到错误消息,提示我不在 UI 线程上,无法访问控件。

为什么我无法访问标签控件?

最佳答案

当您使用 Task.Run() 时,您是在说您希望代码在当前上下文中运行,所以这正是发生的情况.

但是没有必要在你的代码中使用Task.Run()。正确编写的 async 方法不会阻塞当前线程,因此您可以直接从 UI 线程使用它们。如果这样做,await 将确保该方法在 UI 线程上恢复。

这意味着如果你这样写你的代码,它会工作:

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

private async Task Run()
{
await File.AppendText("temp.dat").WriteAsync("a");
label1.Text = "test";
}

关于c# - 在 Task.Run 中使用 async/await 在 WinForms 上访问 UI 控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19028374/

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