gpt4 book ai didi

使用 BackgroundWorker 时 wpf 应用程序崩溃

转载 作者:行者123 更新时间:2023-12-04 21:58:48 24 4
gpt4 key购买 nike

我的 View 模型在其构造函数中创建了一个 BackgroundWorker。 BackgroundWorker 从其 DoWork 事件处理程序更新模型的属性。下面的代码是一个人为的例子(ViewModelBase 几乎一字不差地取自 MVVM 论文)。


public class MyViewModel : ViewModelBase
{
public int MyProperty
{
get
{
return this.my_property;
}
private set
{
if (this.my_property != value)
{
this.my_property = value;
this.OnPropertyChanged("MyProperty");
}
}
}

public MyViewModel()
{
this.worker = new BackgroundWorker();
this.worker.DoWork += (s, e) => { this.MyProperty = 1; };
this.worker.RunWorkerAsync();
}
}

我的 View 绑定(bind)到这个 View 模型:


public partial class MyPage : Page
{
public MyPage()
{
InitializeComponent();
this.DataContext = new MyViewModel();
}
}

问题是我的应用程序在显示我的页面时会间歇性地崩溃。这肯定与 XAML 中的工作线程和数据绑定(bind)有关。似乎如果我从页面的 Loaded 事件处理程序内部启动工作程序,问题就会消失,但由于难以一致地重现,我不确定这是否是正确的解决方案。

有没有人有任何建议或想法可能是什么原因?

编辑:如果我在没有调试器的情况下运行它,我只能重现它。而系统日志中的错误是ShowDialog抛出的InvalidOperationException,帮助不大。在调试器下它运行良好。

感谢您的帮助康斯坦丁

最佳答案

由于 MyProperty 不是线程安全的,因此当两个线程尝试同时访问它时可能会发生奇怪的事情。你应该

  1. 使其线程安全(例如,通过使用 lock 关键字)或

  2. 确保其值仅在 UI 线程中更改。

我建议第二种方法,因为锁定总是一件棘手的事情。特别是 BackgroundWorker 已经支持在工作完成后将值传回 UI 线程:

public void MyViewModel()
{
this.worker = new BackgroundWorker();
this.worker.DoWork += (s, e) => { /* do something */ e.Result = 1; };
this.worker.RunWorkerCompleted += (s, e) =>
{
// all of this happens back in the UI thread
if (e.Error != null)
{
// do some error handling... some exception occurred during DoWork
}
else
{
this.MyProperty = (int)e.Result;
}
};
this.worker.RunWorkerAsync();
}

关于使用 BackgroundWorker 时 wpf 应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3867216/

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