国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

.NET中STAThread的使用詳解_.Net教程

2024-07-10 12:52:31
字體:
來源:轉載
供稿:網友

推薦:.NET中RDLC循環處理數據的應用分析
本篇文章介紹了,.NET中RDLC循環處理數據的應用分析。需要的朋友參考下

在WindowForm應用程序中主要的線程,是采用一種稱為「Single-Threaded Apartment(STA)」的線程模型。這個STA線程模型,在線程內加入了訊息幫浦等等機制,減少開發人員撰寫窗口程序的工作量。

而在開發類別庫的時候,如果要使用類似的STA線程模型,可以使用下列的程序代碼提供的類別來完成。

復制代碼 代碼如下:www.CuoXIn.com

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


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

private readonly BlockingQueue<Action> _actionQueue = null;

private Thread _thread = null;

private ManualResetEvent _threadEvent = null;

private ThreadState _threadState = ThreadState.Stopped;


// Constructor
public STAThread()
{
// ActionQueue
_actionQueue = new BlockingQueue<Action>();

// 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();
}
}
}
}

復制代碼 代碼如下:www.CuoXIn.com

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

private readonly WaitHandle[] _waitHandles = null;

private readonly Queue<T> _itemQueue = null;

private readonly Semaphore _itemQueueSemaphore = null;

private readonly ManualResetEvent _itemQueueReleaseEvent = null;


// Constructors
public BlockingQueue()
{
// Default
_itemQueue = new Queue<T>();
_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中as和is之間的區別分析
.net中as和is之間的區別分析,需要的朋友可以參考一下

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 克什克腾旗| 广汉市| 双牌县| 河北区| 南靖县| 平凉市| 通江县| 南安市| 邻水| 柏乡县| 沙洋县| 清苑县| 密云县| 全椒县| 淮安市| 河北区| 潼南县| 怀柔区| 东乡| 丽江市| 广饶县| 阿城市| 林州市| 石景山区| 赤水市| 杂多县| 崇明县| 江津市| 全州县| 灵武市| 丰镇市| 大渡口区| 昌黎县| 马鞍山市| 昌乐县| 曲麻莱县| 通化市| 南郑县| 建宁县| 新乡市| 新龙县|