gpt4 book ai didi

c# - 为什么 BackgroundWorker_RunWorkerCompleted 不更新 GUI?

转载 作者:太空狗 更新时间:2023-10-29 23:35:31 25 4
gpt4 key购买 nike

我已经搜索过论坛,但我认为没有一个问题适合我的问题......

我使用 BackgroundWorker 来处理一个非常耗时的操作。此操作完成后,应将按钮设置为启用,以便用户可以执行另一个操作。

我正在使用 WPF 并且遵循 MVVM 模式,因此我无法直接访问此按钮。我必须在 BackgroundWorker_RunWorkerCompleted 事件处理程序中调用一个方法,该方法将表示按钮启用状态的属性设置为 true。

除一件事外一切正常:按钮仅在我例如单击进入窗口(或最大化窗口,...)。这很烦人,我花了一整天时间才摆脱这种行为,但我找不到解决方案......

BackgroundWorker_RunWorkerCompleted 事件处理程序如下所示:

    void fileLoadBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
SetButtonToEnabled(); }

有人知道如何解决这个问题吗?

编辑:

按钮绑定(bind)了一个命令:

<Button Name="btnLoadTargetFile" Command="{Binding Path=LoadTargetCommand}" .../>

此命令是 Smith 在其博客 (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx) 中所述的 RelayCommand,如下所示:

public RelayCommand LoadTargetCommand
{
get
{
if (loadTargetCommand == null)
{
loadTargetCommand = new RelayCommand(param => this.OnRequestLoadFile(BusinessLogic.CustomTypes.TreeType.Target), param => this.CanLoadTarget);
}
return loadTargetCommand;
}
set { loadTargetCommand = value; }
}

this.CanLoadTarget 由 SetButtonToEnabled() 设置为 true;方法

编辑 2:

以下代码“有效”:

fileLoadBackgroundWorker.RunWorkerAsync(argumentList);
while(fileLoadBackgroundWorker.IsBusy)
System.Windows.Forms.Application.DoEvents();
SetButtonToEnabled();

但这是某种非常危险和丑陋的代码......

最佳答案

虽然不能解释你的问题,你可以尝试添加

System.Windows.Forms.Application.DoEvents();

Dispatcher.Invoke(new Action(delegate { }), DispatcherPriority.Background);

到您的 SetButtonToEnabled 函数调用结束(在您将按钮 Enabled 设置为 true 之后)。看起来后台工作人员正在调用 Complete 事件,但 GUI 没有刷新。

Here是在 WPF 中使用 Backgroundworker 的完整示例。您可能想看看它并确保您的东西看起来一样。

你也可以看看 Asynchronous Threading with Background Worker Object .这是使用 Dispatcher 和 Backgroundworker 的一个很好的例子

WPF Threading Model是另一个值得检查的重要来源。

关于c# - 为什么 BackgroundWorker_RunWorkerCompleted 不更新 GUI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2006894/

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