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);
}
}