最近,我一直在测试类型绑定,该绑定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。是否有任何解决方法可以使其线程安全而不改变按钮单击方法,即可能在视图模型中使线程安全。