using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Windows; namespace IKende.Windows { public class ThreadUIInvoke { public delegate void EventUIInvoke(); public delegate void EventUIInvoke<T>(T t); public delegate void EventUIInvoke<T, T1>(T t, T1 t1); public delegate void EventUIInvoke<T, T1, T2>(T t, T1 t1, T2 t2); public delegate void EventUIInvoke<T, T1, T2, T3>(T t, T1 t1, T2 t2, T3 t3); public delegate void EventUIInvoke<T, T1, T2, T3, T4>(T t, T1 t1, T2 t2, T3 t3, T4 t4); public ThreadUIInvoke(Form form, int interval) { mContainer = new System.ComponentModel.Container(); mTimer = new Timer(mContainer); mTimer.Tick += OnTick; form.Disposed += (o, d) => { mTimer.Dispose(); mContainer.Dispose(); }; mTimer.Interval = interval; mTimer.Enabled = true; } private System.ComponentModel.Container mContainer; private Timer mTimer; private Queue<InvokeItem> mItems = new Queue<InvokeItem>(256); private Queue<InvokeItem> mWorkItems = new Queue<InvokeItem>(256); private void OnTick(object sender, EventArgs e) { if (mItems.Count > 0) { lock (mItems) { while (mItems.Count > 0) { mWorkItems.Enqueue(mItems.Dequeue()); } } while (mWorkItems.Count > 0) { mWorkItems.Dequeue().Invoke(); } } } private void Add(InvokeItem item) { lock (mItems) { mItems.Enqueue(item); } } public void Invoke(EventUIInvoke eui) { InvokeItem item = new InvokeItem(); item.Functions = eui; item.Parameters = new object[0]; Add(item); } public void Invoke<T>(EventUIInvoke<T> eui, T t) { InvokeItem item = new InvokeItem(); item.Functions = eui; item.Parameters = new object[] { t }; Add(item); } public void Invoke<T, T1>(EventUIInvoke<T, T1> eui, T t, T1 t1) { InvokeItem item = new InvokeItem(); item.Functions = eui; item.Parameters = new object[] { t,t1 }; Add(item); } public void Invoke<T, T1, T2>(EventUIInvoke<T, T1, T2> eui, T t, T1 t1, T2 t2) { InvokeItem item = new InvokeItem(); item.Functions = eui; item.Parameters = new object[] { t,t1,t2 }; Add(item); } public void Invoke<T, T1, T2, T3>(EventUIInvoke<T, T1, T2, T3> eui, T t, T1 t1, T2 t2, T3 t3) { InvokeItem item = new InvokeItem(); item.Functions = eui; item.Parameters = new object[] { t, t1, t2,t3}; Add(item); } public void Invoke<T, T1, T2, T3, T4>(EventUIInvoke<T, T1, T2, T3, T4> eui, T t, T1 t1, T2 t2, T3 t3, T4 t4) { InvokeItem item = new InvokeItem(); item.Functions = eui; item.Parameters = new object[] { t, t1, t2, t3,t4 }; Add(item); } class InvokeItem { public Delegate Functions { get; set; } public object[] Parameters { get; set; } public void Invoke() { Functions.DynamicInvoke(Parameters); } } } }
private ThreadUIInvoke mUIInvoke; private void Form1_Load(object sender, EventArgs e) { mUIInvoke = new ThreadUIInvoke(this, 200); System.Threading.ThreadPool.QueueUserWorkItem(Test); System.Threading.ThreadPool.QueueUserWorkItem(Test); System.Threading.ThreadPool.QueueUserWorkItem(Test); } private void Test(object state) { while (true) { mUIInvoke.Invoke<ListBox>(o => { o.Items.Add(Guid.NewGuid()); }, listBox1); System.Threading.Thread.Sleep(20); } }