gpt4 book ai didi

c# - 循环中的 WPF 应用程序,如何不让整个应用程序卡住?

转载 作者:行者123 更新时间:2023-11-30 19:00:58 24 4
gpt4 key购买 nike

我在玩 WPF 时遇到了问题。我用谷歌搜索并找到了这个 website这和我有同样的问题,但没有任何有效的解决方案。

问题是我有一个按钮可以处理一些数据(大约 30 秒)。我想要禁用按钮并在文本框中写入日志...问题是它不会禁用并且在处理完成之前不会在文本框中写入任何内容。

有什么想法吗?

 private void button1_Click(object sender, RoutedEventArgs e)
{
this.button1.IsEnabled = false;
//Long stuff here
txtLog.AppendText(Environment.NewLine + "Blabla");
//End long stuff here
this.button1.IsEnabled = true;
}

最佳答案

正如其他人所说,使用 BackgroundWorker或其他一些异步工作的方法。

您可以在Window 下声明它,在某个地方像Loaded 事件一样初始化它,然后在Click 事件中使用它。这是您的方法,已修改为使用 BackgroundWorker,假设您已在 Window 下将其声明为 _bw:

private void Window_Loaded(object sender, RoutedEventArgs e)
{
_bw = new BackgroundWorker();
_bw.DoWork += new DoWorkEventHandler((o, args) =>
{
//Long stuff here
this.Dispatcher.Invoke((Action)(() => txtLog.AppendText(Environment.NewLine + "Blabla")));
});

_bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler((o, args) =>
{
//End long stuff here
this.Dispatcher.Invoke((Action)(() => this.button1.IsEnabled = true));
});
}

private void button1_Click(object sender, RoutedEventArgs e)
{
this.button1.IsEnabled = false;

_bw.RunWorkerAsync();
}

请注意,任何从另一个线程修改您的 UI 的操作都必须在 Dispatcher.Invoke 中完成或 Dispatcher.BeginInvoke调用时,WPF 不允许您从除创建对象的线程以外的任何线程获取或设置 DependencyProperty 值(关于此 here 的更多信息)。

如果你想从 txtLog 中读取而不是修改它,代码将是相同的:

//Long stuff here       
this.Dispatcher.Invoke((Action)(() =>
{
string myLogText = txtLog.Text;
myLogText = myLogText + Environment.NewLine + "Blabla";
txtLog.Text = myLogText;
}));

关于c# - 循环中的 WPF 应用程序,如何不让整个应用程序卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/651857/

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