亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > .NET中STAThread的使用詳解

.NET中STAThread的使用詳解

熱門標簽:鄭州400電話辦理 聯通 電銷語音自動機器人 戶外地圖標注軟件手機哪個好用 萊蕪外呼電銷機器人價格 長春呼叫中心外呼系統哪家好 五常地圖標注 地圖標注和認領 凱立德導航官網地圖標注 智能電話營銷外呼系統

在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中STAThread的使用詳解》,本文關鍵詞  .NET,中,STAThread,的,使用,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《.NET中STAThread的使用詳解》相關的同類信息!
  • 本頁收集關于.NET中STAThread的使用詳解的相關信息資訊供網民參考!
  • 推薦文章
    黄视频网站在线观看| 在线观看成人网| 欧美激情一区二区三区视频| 尤物视频网站在线观看| 久久精品店| 久久国产精品只做精品| 可以在线看黄的网站| 成人影院一区二区三区| 日本在线不卡视频| 国产一区免费观看| 国产一区二区精品| 亚洲精品永久一区| 日韩字幕在线| 黄色福利片| 亚洲精品中文字幕久久久久久| 亚洲www美色| 九九干| 一a一级片| 99热视热频这里只有精品| 久久精品免视看国产明星| 人人干人人插| 久久国产精品自线拍免费| 国产精品自拍一区| 二级片在线观看| 日韩一级黄色大片| 成人在激情在线视频| 国产成人精品影视| 国产a毛片| 色综合久久天天综合观看| 99热精品在线| 99色视频在线观看| 麻豆网站在线看| 亚洲精品久久玖玖玖玖| 在线观看成人网| 精品视频一区二区| 日韩一级黄色片| 欧美一级视| 青青青草影院| 日韩一级黄色大片| 日本在线不卡视频| 色综合久久天天综合| 成人免费观看视频| 国产麻豆精品免费视频| 日本在线不卡视频| 日韩专区亚洲综合久久| 国产麻豆精品免费密入口| 精品国产一区二区三区精东影业| 欧美1区| 成人免费观看男女羞羞视频| 久久福利影视| 可以免费看污视频的网站| 韩国三级香港三级日本三级| 精品久久久久久中文| 色综合久久天天综合绕观看| 尤物视频网站在线观看| 久草免费在线色站| 免费一级片在线| 午夜家庭影院| 精品视频在线看 | 久久久久久久网| 成人免费网站久久久| 日本特黄特黄aaaaa大片| 久久99爰这里有精品国产| 国产a一级| 麻豆网站在线看| 欧美激情影院| 亚州视频一区二区| 999精品视频在线| 欧美激情一区二区三区在线| 国产伦久视频免费观看视频| 国产成人啪精品| 999久久久免费精品国产牛牛| 国产一区免费在线观看| 欧美激情一区二区三区在线| 一级片片| 午夜在线观看视频免费 成人| 日韩中文字幕一区二区不卡| 免费国产在线视频| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 国产91素人搭讪系列天堂| 欧美18性精品| 国产亚洲精品aaa大片| 国产成人啪精品视频免费软件| 亚洲精品久久玖玖玖玖| 久久久久久久男人的天堂| 欧美激情一区二区三区视频| 亚洲第一页乱| 日韩在线观看网站| 欧美大片a一级毛片视频| 久久国产精品永久免费网站| 国产极品白嫩美女在线观看看| 国产不卡福利| 久久国产精品自线拍免费| 亚洲精品中文一区不卡| 亚洲精品影院久久久久久| 精品视频一区二区| 黄视频网站在线免费观看| 999精品视频在线| 久久久久久久免费视频| 欧美另类videosbestsex久久 | 免费国产一级特黄aa大片在线| 国产一区免费在线观看| 成人a级高清视频在线观看| 国产美女在线一区二区三区| 四虎久久精品国产| 成人a级高清视频在线观看| 亚洲天堂在线播放| 国产一区免费在线观看| 国产精品1024在线永久免费| 国产麻豆精品| 国产精品自拍在线| 美女免费精品高清毛片在线视| 国产高清在线精品一区二区| 你懂的日韩| 国产成+人+综合+亚洲不卡 | 久久精品大片| 免费的黄色小视频| 沈樵在线观看福利| 久久久久久久久综合影视网| 国产原创中文字幕| a级黄色毛片免费播放视频| 久久福利影视| 国产一区精品| 日韩在线观看网站| 一 级 黄 中国色 片| 四虎影视精品永久免费网站| 成人高清免费| 日本特黄一级| 九九久久99综合一区二区| 亚洲wwwwww| 欧美国产日韩久久久| 欧美激情在线精品video| 欧美另类videosbestsex视频| 色综合久久久久综合体桃花网| 午夜在线观看视频免费 成人| 麻豆污视频| 精品国产一区二区三区免费 | 久久精品大片| 欧美国产日韩久久久| 日韩中文字幕在线亚洲一区| 日韩字幕在线| 你懂的国产精品| 欧美激情一区二区三区视频高清| 久久福利影视| 高清一级毛片一本到免费观看| 可以免费在线看黄的网站| 美女被草网站| 91麻豆精品国产高清在线| 韩国毛片基地| 九九久久99| 亚洲精品影院久久久久久| 久久精品成人一区二区三区| 日韩在线观看视频网站| 成人高清免费| 精品久久久久久中文字幕一区| 日韩男人天堂| 午夜精品国产自在现线拍| 欧美日本免费| 高清一级毛片一本到免费观看| 九九干| 日本特黄一级| 欧美大片一区| 亚洲 国产精品 日韩| 亚飞与亚基在线观看| 久久久久久久免费视频| 91麻豆国产福利精品| 一级片免费在线观看视频| 久草免费在线观看| 黄色短视屏| 免费国产在线观看| 日本伦理网站| 91麻豆爱豆果冻天美星空| 中文字幕一区二区三区精彩视频| 亚飞与亚基在线观看| 亚洲女初尝黑人巨高清在线观看| 精品国产香蕉在线播出| 精品视频免费看| 久久精品店| 精品国产一区二区三区久久久狼| 99色视频在线观看| 国产网站在线| 国产成人女人在线视频观看| 999久久66久6只有精品| 高清一级淫片a级中文字幕| 99久久视频| 你懂的日韩| 亚洲 激情| 日本免费区| 免费毛片基地| 日本伦理黄色大片在线观看网站| 国产91精品露脸国语对白| 久久成人性色生活片| 国产网站免费在线观看| 国产一区二区精品尤物| 欧美国产日韩精品| 深夜做爰性大片中文| 久久国产影视免费精品| 日韩免费在线| 精品国产三级a∨在线观看| 深夜做爰性大片中文|