如何在Thread完成</int,>时从ConcurrentDictionary <int,thread =“”>中删除Thread

时间:2014-04-01 14:15:48

标签: c# multithreading wcf windows-services

以下是我的项目要求:

  1. 承载WCF服务的Windows服务。
  2. WCF服务必须启动并跟踪许多线程。
  3. 每个帖子必须可以通过提供的密钥识别。
  4. 会有许多不同类型的任务(线程),每个任务都有一个“一次最大运行”限制,其他任务在队列中,直到其他相同类型的任务完成。
  5. 到目前为止我所拥有的:

    1. 承载WCF服务的Windows服务(类似于http://msdn.microsoft.com/en-us/library/ms733069(v=vs.110).aspx)。
    2. 包含Thread的抽象类(使用组合,因为我无法扩展Thread)
    3. 在WCF服务类中,我有一个名为MyThreadPool的类的静态实例,其中包含一个ConcurrentDictionary,用于记录我正在运行的线程。
    4. 我的问题是:

      1. 从线程列表中删除已完成的线程的最佳方法是什么(线程完成时)?
      2. 在这种情况下,ConcurrentDictionary的静态实例是管理线程的好方法吗?如果没有,可以推荐什么?
      3. 我的一些代码如下所示:

        [ServiceContract(Namespace = "...")]
        public interface IMyService    
        {
            [OperationContract]
            void StartProcess(int MIndexId, int MProcessId);
            [OperationContract]
            void StopProcess(int MIndexProcessId);
        }
        
        public class MyService : IMyService
        {
            private static MyThreadPool threadPool = new MyThreadPool();
        
            public void StopProcess(int MIndexProcessId)
            {
                throw new NotImplementedException();
            }
        
            public void StartProcess(int ItemIdToProcess, int ProcessTypeId)
            {
                // call threadPool.LaunchThread(...)
            }
        }
        
        public class MyThreadPool
        {
            private ConcurrentDictionary<int, BaseThread> _threads;
            ...
            public void LaunchThread(BaseThread thread, int ItemIdToProcess)
            {
                // set additional data for thread (such as a key and name) for tracking in a database
                _threads.AddOrUpdate(ItemIdToProcess, thread, (key, oldValue) => { return      oldValue; });
                thread.Start();
            }
            public void KillThread(int ItemIdToProcess)
            { 
                ...
            }
        }
        
        public abstract class BaseThread
        {
            // some additional properties for tracking thread
            // ...
            private Thread _thread;
        
            protected BaseThread()
            { 
                _thread = new Thread(new ThreadStart(this.RunThread));
                _thread.IsBackground = true;
            }
            // Thread methods / properties
            public void Start() { _thread.Start(); }
            public void Join() { _thread.Join(); }
            public bool IsAlive { get { return _thread.IsAlive; } }
            public string Name
            {
                get
                {
                    return _thread.Name;
                }
                set
                {
                    _thread.Name = value;
                }
            }
            public void Abort()
            {
                _thread.Abort();
            }
            public abstract void RunThread();
        }
        
        public class ValidateThread : BaseThread
        {
            public override void RunThread()
            {
                ...
                // indicate to calling thread to remove from thread list();
            }
        }
        

1 个答案:

答案 0 :(得分:3)

  1. 完成所有有意义的工作后,让线程自行移除。更好的是,将TaskLongRunning选项一起使用。编写任务很容易。
  2. 似乎合情合理。你已经避免了很多陷阱,设计看起来很稳固。在IIS中托管的WCF服务的一个缺陷是工作进程可能随时死亡。您可以使用Windows服务来避免这种情况。
  3. Windows服务大多是外部启动的exe,与其他任何一样。

    但有一件事是不可行的:_thread.Abort(); Thread.Abort is evil。取消必须(不是:应该)在.NET中合作。