如何在 C# 中调用跨线程绑定列表<T>



需要对当前正在生产的程序进行补充,而我实际上不能进行太多的架构更改。

主线程(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唯一运行的东西。因此,可以从这两个线程中提出的属性变化没有问题。

相关文章您可能会发现教育或混乱:)没有中间立场:)

相关内容

  • 没有找到相关文章

最新更新