返回首页

执行任务
我不想写的代码派生线程块,并执行许多我的后台任务,如触发事件,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,并提供在他们排队的顺序执行任务的设施。希望有用!

回答

评论会员:a 时间:2