namespace WindowsFormsApplication1
{
public partial class Myform : Form
{
public BindingList跨线程绑定使用SynchronizationContext()
{
InitializeComponent();
Initial();
}
public UiBindList<OBJ> _list { get; set; }
private void Initial()
{
_list = new UiBindList<OBJ> { SynchronizationContexts = SynchronizationContext.Current };
dataGridView1.DataBindings.Add("DataSource", this, "_list", false, DataSourceUpdateMode.OnPropertyChanged);
new Thread(() =>
{
while (true)
{
Thread.Sleep(1000);
_list.Add(new OBJ { Name = "C#" });
}
})
{
IsBackground = true,
}
.Start();
}
}
public class UiBindList<T> : BindingList<T>
{
public SynchronizationContext SynchronizationContexts { get; set; }
public void Excute(Action action, object state = null)
{
if (SynchronizationContexts == null)
action();
else
SynchronizationContexts.Post(p => action(), state);
}
public new void Add(T item)
{
Excute(() => base.Add(item));
}
public new void Remove(T item)
{
Excute(() => base.Remove(item));
}
}
public class OBJ { public string Name { get; set; } }
在Add方式中 报错!!对象的当前状态使该操作无效。
请问高手是怎么回事!!!
你这个写法肯定报错,dataGridView1 应该是页面控件,只有主线程可以这么写。
可以参考这个写法
Action action = () => { _list.Add(new OBJ { Name = "C#" }); }; if (this.InvokeRequired) { this.Invoke(action); } else { action(); }
您肯定是没有用过SynchronizationContext这个...!!!那种是最原始的写法、、