【发布时间】:2016-04-18 07:40:58
【问题描述】:
最近,我一直在测试实现INotifyPropertyChanged 的类型绑定,并从工作线程引发跨线程问题更新属性。
这里是示例代码:
public class MyViewModel : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged("Name");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler hanlder = PropertyChanged;
if(hanlder != null)
hanlder(this, new PropertyChangedEventArgs(propertyName));
}
}
上面的viewmodel已经与windows窗体中的标签文本绑定,并从工作线程更新标签值。
从工作线程更新 label1 文本会导致跨线程问题:
public partial class MainForm : Form
{
private MyViewModel _myViewModel = new MyViewModel();
public MainForm()
{
InitializeComponent();
Btn1.Click += Btn1_Click;
label1.DataBindings.Add("Text", _myViewModel, "Name");
}
private void Btn1_Click(object sender, EventArgs e)
{
Task.Factory.StartNew(() =>
{
_myViewModel.Name = "Updating from worker thread!"; It causes cross thread issue
});
}
}
到目前为止,我可以相信这是由于从工作线程更新 UI。是否有任何解决方法可以使其线程安全而不改变按钮单击方法,即可能在视图模型中使线程安全。
【问题讨论】:
-
使用 Dispatcher 更新 UI
标签: c# winforms c#-4.0 task worker-thread