• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    .NET中STAThread的使用详解

    在WindowForm应用程序中主要的线程,是采用一种称为「Single-Threaded Apartment(STA)」的线程模型。这个STA线程模型,在线程内加入了讯息帮浦等等机制,减少开发人员撰写窗口程序的工作量。
     

    而在开发类别库的时候,如果要使用类似的STA线程模型,可以使用下列的程序代码提供的类别来完成。

    复制代码 代码如下:

    namespace CLK.Threading
    {
        public class STAThread
        {
            // Enum
            private enum ThreadState
            {
                Started,
                Stopping,
                Stopped,
            }

     
            // Fields
            private readonly object _syncRoot = new object();

            private readonly BlockingQueueAction> _actionQueue = null;

            private Thread _thread = null;

            private ManualResetEvent _threadEvent = null;

            private ThreadState _threadState = ThreadState.Stopped;     

     
            // Constructor
            public STAThread()
            {
                // ActionQueue
                _actionQueue = new BlockingQueueAction>();

                // ThreadEvent
                _threadEvent = new ManualResetEvent(true);

                // ThreadState
                _threadState = ThreadState.Stopped;     
            }

     
            // Methods
            public void Start()
            {          
                // Sync
                lock (_syncRoot)
                {
                    // ThreadState
                    if (_threadState != ThreadState.Stopped) throw new InvalidOperationException();
                    _threadState = ThreadState.Started;
                }

                // Thread
                _thread = new Thread(this.Operate);
                _thread.Name = string.Format("Class:{0}, Id:{1}", "STAThread", _thread.ManagedThreadId);
                _thread.IsBackground = false;
                _thread.Start();
            }

            public void Stop()
            {
                // Sync
                lock (_syncRoot)
                {
                    // ThreadState
                    if (_threadState != ThreadState.Started) throw new InvalidOperationException();
                    _threadState = ThreadState.Stopping;

                    // ActionQueue
                    _actionQueue.Release();
                }

                // Wait
                _threadEvent.WaitOne();
            }

     
            public void Post(SendOrPostCallback callback, object state)
            {
                #region Contracts

                if (callback == null) throw new ArgumentNullException();

                #endregion

                // Action
                Action action = delegate()
                {
                    try
                    {
                        callback(state);
                    }
                    catch (Exception ex)
                    {
                        Debug.Fail(string.Format("Delegate:{0}, State:{1}, Message:{2}", callback.GetType(), "Exception", ex.Message));
                    }
                };

                // Sync
                lock (_syncRoot)
                {
                    // ThreadState
                    if (_threadState != ThreadState.Started) throw new InvalidOperationException();

                    // ActionQueue
                    _actionQueue.Enqueue(action);
                }                     
            }

            public void Send(SendOrPostCallback callback, object state)
            {
                #region Contracts

                if (callback == null) throw new ArgumentNullException();

                #endregion

                // Action
                ManualResetEvent actionEvent = new ManualResetEvent(false);
                Action action = delegate()
                {
                    try
                    {
                        callback(state);
                    }
                    catch (Exception ex)
                    {
                        Debug.Fail(string.Format("Delegate:{0}, State:{1}, Message:{2}", callback.GetType(), "Exception", ex.Message));
                    }
                    finally
                    {
                        actionEvent.Set();
                    }
                };

                // Sync
                lock (_syncRoot)
                {
                    // ThreadState
                    if (_threadState != ThreadState.Started) throw new InvalidOperationException();

                    // ActionQueue
                    if (Thread.CurrentThread != _thread)
                    {
                        _actionQueue.Enqueue(action);
                    }
                }

                // Execute
                if (Thread.CurrentThread == _thread)
                {
                    action();
                }

                // Wait
                actionEvent.WaitOne();
            }

     
            private void Operate()
            {
                try
                {
                    // Begin
                    _threadEvent.Reset();

                    // Operate
                    while (true)
                    {
                        // Action
                        Action action = _actionQueue.Dequeue();

                        // Execute
                        if (action != null)
                        {
                            action();
                        }

                        // ThreadState
                        if (action == null)
                        {
                            lock (_syncRoot)
                            {
                                if (_threadState == ThreadState.Stopping)
                                {
                                    return;
                                }
                            }
                        }
                    }
                }
                finally
                {
                    // End
                    lock (_syncRoot)
                    {
                        _threadState = ThreadState.Stopped;
                    }
                    _threadEvent.Set();
                }
            }
        }
    }

    复制代码 代码如下:

    namespace CLK.Threading
    {
        public class BlockingQueueT>
        {
            // Fields      
            private readonly object _syncRoot = new object();

            private readonly WaitHandle[] _waitHandles = null;

            private readonly QueueT> _itemQueue = null;

            private readonly Semaphore _itemQueueSemaphore = null;

            private readonly ManualResetEvent _itemQueueReleaseEvent = null;

     
            // Constructors
            public BlockingQueue()
            {
                // Default
                _itemQueue = new QueueT>();
                _itemQueueSemaphore = new Semaphore(0, int.MaxValue);
                _itemQueueReleaseEvent = new ManualResetEvent(false);
                _waitHandles = new WaitHandle[] { _itemQueueSemaphore, _itemQueueReleaseEvent };
            }

     
            // Methods
            public void Enqueue(T item)
            {
                lock (_syncRoot)
                {
                    _itemQueue.Enqueue(item);
                    _itemQueueSemaphore.Release();
                }
            }

            public T Dequeue()
            {
                WaitHandle.WaitAny(_waitHandles);
                lock (_syncRoot)
                {
                    if (_itemQueue.Count > 0)
                    {
                        return _itemQueue.Dequeue();
                    }
                }
                return default(T);
            }

            public void Release()
            {
                lock (_syncRoot)
                {
                    _itemQueueReleaseEvent.Set();
                }
            }

            public void Reset()
            {
                lock (_syncRoot)
                {
                    _itemQueue.Clear();
                    _itemQueueSemaphore.Close();
                    _itemQueueReleaseEvent.Reset();
                }
            }
        }
    }

    您可能感兴趣的文章:
    • .NET Windows 多线程thread编程
    • 深入多线程之:解析线程的交会(Thread Rendezvous)详解
    • C++实现CreatThread函数主线程与工作线程交互的方法
    • C++线程优先级SetThreadPriority的使用实例
    • C++封装远程注入类CreateRemoteThreadEx实例
    • C++ AfxBeginThread的介绍/基本用法
    上一篇:基于.NET中建构子中传递子对象的对象详解
    下一篇:.NET中RDLC循环处理数据的应用分析
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    .NET中STAThread的使用详解 .NET,中,STAThread,的,使用,