在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 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();
}
}
}
}
复制代码 代码如下:
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,stathread
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 中国武警男声合唱团《辉煌之声1天路》[DTS-WAV分轨]
- 紫薇《旧曲新韵》[320K/MP3][175.29MB]
- 紫薇《旧曲新韵》[FLAC/分轨][550.18MB]
- 周深《反深代词》[先听版][320K/MP3][72.71MB]
- 李佳薇.2024-会发光的【黑籁音乐】【FLAC分轨】
- 后弦.2012-很有爱【天浩盛世】【WAV+CUE】
- 林俊吉.2012-将你惜命命【美华】【WAV+CUE】
- 晓雅《分享》DTS-WAV
- 黑鸭子2008-飞歌[首版][WAV+CUE]
- 黄乙玲1989-水泼落地难收回[日本天龙版][WAV+CUE]
- 周深《反深代词》[先听版][FLAC/分轨][310.97MB]
- 姜育恒1984《什么时候·串起又散落》台湾复刻版[WAV+CUE][1G]
- 那英《如今》引进版[WAV+CUE][1G]
- 蔡幸娟.1991-真的让我爱你吗【飞碟】【WAV+CUE】
- 群星.2024-好团圆电视剧原声带【TME】【FLAC分轨】