gpt4 book ai didi

c# - 如何正确隐藏按钮并在我的 BackgroundWorker 执行某些操作后显示它?

转载 作者:行者123 更新时间:2023-12-02 22:20:32 24 4
gpt4 key购买 nike

这是我到目前为止尝试过的:

  1. button.Visible = false 放入我的表单的初始值设定项并将 button.Visible = true 放入我的 backgroundWorkers 的 DoWork 事件的末尾。
    这会导致程序在 BackgroundWorker 完成工作后卡住。
    我不明白为什么。

  2. button.Visible = false 放入我的表单的初始化程序中,并将 button.Visible = true 放在我的 backgroundWorker1.RunWorkerAsync() 之后> 打电话。
    这不能正常工作,因为它会在 BackgroundWorker 开始工作后立即显示按钮。
    我明白为什么会这样。

  3. button.Visible = falsedoneEvent = new AutoResetEvent(false) 放入我的表单的初始化程序中,然后将 doneEvent.WaitOne()button.Visible = true 在我的 backgroundWorker1.RunWorkerAsync() 调用之后。
    这样,一切正常除了我在表单中的 ProgressBar 停止正常工作(它在所有工作完成之前不显示进度)。
    我可能对为什么会这样有一个直观的想法,但我并不真正理解它,我不知道如何解决它。

最佳答案

当您的代码在 DoWork 事件中运行时,您不应在按钮上调用任何方法/属性,因为此代码与创建按钮的线程位于不同的线程中。
BackgroundWorkwer使用一组定义良好的事件来处理需要更新界面的情况,并且应该将这些事件用于该任务。

例如,您可以将属性 WorkerReportsProgress 设置为 true,订阅事件 ProgressChanged 并调用 backgroundWorker1.ReportProgress(...); 在 DoWork 事件中更新您的界面,同时您的后台工作正在进行。

在您的情况下,您可能需要订阅事件 RunWorkerCompleted 并在该事件中显示您的按钮

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (!e.Cancelled && e.Error == null)
{
button.Visible = true;
}
}

在指向 BackgroundWorker 的 MSDN 页面的链接中,有一个示例演示了如何在 DoWork 事件运行复杂任务时更新进度条。

关于c# - 如何正确隐藏按钮并在我的 BackgroundWorker 执行某些操作后显示它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13779186/

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