需要对当前正在生产的程序进行补充,而我实际上不能进行太多的架构更改。
主线程(T1) -> GUI元素其他线程(T2 ...) ->计算元素(和外部事件)。
有一个在T2上运行的对象类Foo
。Foos是根据各种外部事件创建的。
我需要将数据杂志添加到一个新表单中,该表格将简单地显示不同的foo对象的属性。
Foo
实现INotifyPropertyChanged
Winform GridForm
具有BindingList<Foo> FooList
对象。GridView的数据与之绑定。
显然,当我在Foo
中调用NotifyPropertyChanged
时,我正在打一个X线程调用那是行不通的。
我不能从主线程中产生我的 Foo
对象,也不能在thread2上制作表单。
我在这里挠头如何调用主线程。
i确实有一个静态类Foo-Brain
,它具有对主要形式的引用(因此我可以获得GUI线程。)。问题是如何将所有这些绑在一起。
有什么想法?
(我正在考虑重复Foo
对象并在GUI线程上运行它们,并具有FooList
的疑虑,但这似乎是涉及骇客和效率低下的方式)。
谢谢。
ps。希望每个人都对桑迪一切顺利。
编辑:示例代码:
class Person : INotifyPropertyChanged // this is the object that will be updated from a
//different thread; It will have the reference to the main form (GUI)
{
public event PropertyChangedEventHandler PropertyChanged;
string comments;
private Form1 mainForm = null;
private void NotifyPropertyChanged(string name)
{
if (PropertyChanged == null) return;
PropertyChanged(this, new PropertyChangedEventArgs(name));
}
public Person(string comments, Form1 f)
{
this.mainForm = f;
this.comments = comments;
}
public string Comments
{
get { return comments; }
set
{ comments = value;
NotifyPropertyChanged("Comments");
}
}
}
GUI表格的代码:
private void Form1_Load(object sender, EventArgs e)
{
gridControl.DataSource = gridDataList;
}
private void runmethread()
{
Thread t = new Thread(anotherthread);
t.Start();
}
private void anotherthread()
{
gridDataList[0].Comments = "NEW THREAD";
}
private void button1_Click(object sender, EventArgs e)
{
runmethread();
}
private void button2_Click(object sender, EventArgs e)
{
gridDataList[0].Comments = "OLD THREAD";
}
显然button1_click带有原因X线程问题(我要解决的问题)
我认为这就是您要问的...
将您的InotifyPropertychanged在FOO中更改为:
public class Foo: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String propertyName = "")
{
if (PropertyChanged != null)
{
if (mainForm.InvokeRequired)
{
mainForm.Invoke((MethodInvoker) delegate
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
});
}
else
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
}
这将确保每当发生属性变化的事件(以及在运行时的整个持续时间)时,这将是T1唯一运行的东西。因此,可以从这两个线程中提出的属性变化没有问题。
相关文章您可能会发现教育或混乱:)没有中间立场:)