回到我原来的非托管c ++时代,我可以信任多线程应用程序中的关键部分.所以,现在使用dotNet/C#,我正在转发锁定机制.通过锁定资源,我确信任何线程都无法在我的代码段中访问这些资源.
这在dotNet中似乎不是真的!
我有我的Windows服务应用程序.我创建了一个主托管线程,其中隐藏的表单托管了第三个奇偶校验OCX.在这个线程中,我做消息在一个对象列表上进行轮询.此管理线程中的OCX触发的事件会修改此对象列表.
我在这里发布了我的代码的简化部分:
public bool Start()
{
ServiceIsRunning = true;
m_TaskThread = new Thread(new ParameterizedThreadStart(TaskLoop));
m_TaskThread.SetApartmentState(ApartmentState.STA);
m_TaskThread.Start(this);
return true;
}
private void OnOCXEvent(object objToAdd)
{
lock(m_ObjectList)
{
m_ObjectList.Add(objToAdd); }
}
}
private void CheckList()
{
lock(m_ObjectList)
{
foreach(object obj in m_ObjectList)
{
...
}
}
}
[STAThread] // OCX requirement!
private void TaskLoop(object startParam)
{
try {
...
while (ServiceIsRunning)
{
// Message pump
Application.DoEvents();
if (checkTimeout.IsElapsed(true))
{
CheckList();
}
// Relax process CPU time!
Thread.Sleep(10);
}
} …Run Code Online (Sandbox Code Playgroud)