gpt4 book ai didi

c# - 使用 System.Threading.Task 访问 winform 控件卡住

转载 作者:太空狗 更新时间:2023-10-30 01:02:55 27 4
gpt4 key购买 nike

新的 Task 类在 WPF 中运行良好。但是在 Winforms 中,每次尝试访问 Winform 控件时总是卡住。下面的“InvokeRequired”例程已经与 BackgroundWorker 和 Thread 类一起使用,以防止跨线程操作错误。但是,由于某些原因,当涉及到 Task 时,它会卡在 Invoke 方法上。帮助?

这是一个示例代码。我使用 NET 4.5.1 框架。

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

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

private void button1_Click(object sender, EventArgs e)
{
string now = DateTime.Now.ToString();
Task t = new Task(() => { setText(now); });
t.Start();
t.Wait();
}

private void setText(string text)
{
if (textBox1.InvokeRequired)
{
textBox1.Invoke(new Action(() => textBox1.Text = text)); //stuck forever here
}
else
{
textBox1.Text = text;
}
}
}
}

最佳答案

你自己陷入了僵局。您运行一个任务,但使用 Task.Wait() 同步阻止它。此操作会阻塞 UI 线程。现在,从后台线程,您将一条消息同步发布到您刚刚阻止的同一个 UI 消息循环。因此,出现了僵局。

对此的解决方案不是阻止 Task,而是异步等待它。虽然问题确实浮现在脑海中,但如果您只与 UI 元素交互,为什么首先要在后台线程中进行交互?

private async void button1_Click(object sender, EventArgs e)
{
string now = DateTime.Now.ToString();
await Task.Run(() => { setText(now); });
}

关于c# - 使用 System.Threading.Task 访问 winform 控件卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31755070/

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