擴展BindingList,防止增長、刪除項時自動更新界面而不出現「跨線程操做界面控件 corss thread operation」異常

在作界面程序時,經常須要一些數據類,界面元素經過綁定等方式顯示出數據,然而因爲UI線程不是線程安全的,通常都須要經過Invoke等方式來調用界面控件。但對於數據綁定bindingList而言,無法響應listchang事件,致使後端的grid等控件不能更新數據。廢了好大的勁終於找到一個UIBindingList,實現線程數據的同步!後端

using System;
using System.ComponentModel; using System.Threading; using System.Windows.Forms; namespace TempForms { public partial class Form1 : Form { public Form1() { InitializeComponent(); Initial(); } private UiBindList<int> _list; private void Initial() { _list = new UiBindList<int> { SynchronizationContext = SynchronizationContext.Current }; bindingSource1.DataSource = _list; new Thread(() => { while (true) { Thread.Sleep(1000); var newItem = DateTime.Now.Second; _list.Add(newItem); Thread.Sleep(1000); _list.Remove(newItem); } }) { IsBackground = true, } .Start(); } } /// <summary> /// 擴展BindingList,防止增長、刪除項時自動更新界面而不出現「跨線程操做界面控件」異常 /// </summary> class UiBindList<T> : BindingList<T> { /// <summary> /// 界面同步上下文 /// </summary> public SynchronizationContext SynchronizationContext { get; set; } /// <summary> /// 使用此方法執行一切操做上下文相關的操做 /// </summary> private void Excute(Action action, object state = null) { if (SynchronizationContext == null) action(); else SynchronizationContext.Post(d => action(), state); } public new void Add(T item) { Excute(() => base.Add(item)); } public new void Remove(T item) { Excute(() => base.Remove(item)); } } }
相關文章
相關標籤/搜索