执行任务
我不想写的代码派生线程块,并执行许多我的后台任务,如触发事件,UI更新,等等,相反,我会使用System.Threading.ThreadPool类,它为这个目的。谁知道这种情况下使用这个类的程序员也会知道,排队到线程池的任务是不是在他们排队的顺序调度。他们被分派执行在一个偶然的时尚的。
在某些情况下,它需要在他们排队的顺序排队到线程池的任务调度(和执行)。例如,在我(和大多数?)的应用,一系列事件被解雇通知客户端(服务器)应用程序里面是什么发生。虽然事件可能会从任何线程(异步)发射的,我希望他们或客户端,而将预期的事件是在一定的秩序,这与内被请求的服务器应用程序进行的步骤序列对齐收到服务。所以顺序排队任务的执行,是不是必须不想的。
够了.......吃代码。using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace System.Threading
{
struct ThreadPoolTaskInfo
{
public readonly WaitCallback CallbackDelegate;
public readonly object State;
public ThreadPoolTaskInfo(WaitCallback wc, object state)
{
Debug.Assert(wc != null);
CallbackDelegate = wc;
State = state;
}
}
class OrderedThreadPool
{
private Queue workItemQ = new Queue();
public void QueueUserWorkItem(WaitCallback wcbDelegate, object state)
{
lock (workItemQ)
{
workItemQ.Enqueue(new ThreadPoolTaskInfo(wcbDelegate, state));
if (workItemQ.Count == 1)
{
ThreadPool.QueueUserWorkItem(LoopWork);
}
}
}
private void LoopWork(object notUsed)
{
WaitCallback wcb = null;
object state = null;
lock (workItemQ)
{
if (workItemQ.Count == 0)
{
return;
}
ThreadPoolTaskInfo tptInfo = workItemQ.Dequeue();
state = tptInfo.State;
wcb = tptInfo.CallbackDelegate;
Debug.Assert(wcb != null);
}
try
{
wcb(state);
}
finally
{
ThreadPool.QueueUserWorkItem(LoopWork, notUsed);
}
}
}
}
上面的类包装System.Threading.ThreadPool,并提供在他们排队的顺序执行任务的设施。希望有用!