gpt4 book ai didi

c# - 在 .NET 的后台线程上运行遗留的、不可重入的代码

转载 作者:行者123 更新时间:2023-11-30 19:21:58 26 4
gpt4 key购买 nike

我的 .NET 应用程序需要一个线程 worker - .NET 有几个类,例如线程池等,但我找不到任何在单个线程上运行的东西,这是我的要求案例。

所以我自己尝试写了一个,但是这些东西是出了名的棘手,我确定我有什么不对的地方。任何人都可以改进它或指出我已经写过的类似内容的方向吗?

public class ThreadWorker : IDisposable
{
public ThreadWorker()
{
m_Thread = new Thread(ThreadMain);
m_Thread.IsBackground = true;
m_Thread.Name = "Worker Thread";
m_Thread.Start();
}

public void Dispose()
{
if (!m_Terminate)
{
m_Terminate = true;
m_Event.Set();
m_Thread.Join();
}
}

public void QueueUserWorkItem(Action<object> callback, object data)
{
lock (m_Queue) m_Queue.Enqueue(new WorkItem(callback, data));
m_Event.Set();
}

void ThreadMain()
{
while (!m_Terminate)
{
if (m_Queue.Count > 0)
{
WorkItem workItem;
lock (m_Queue) workItem = m_Queue.Dequeue();
workItem.Callback(workItem.Data);
}
else
{
m_Event.WaitOne();
}
}
}

class WorkItem
{
public WorkItem(Action<object> callback, object data)
{
Callback = callback;
Data = data;
}

public Action<object> Callback;
public object Data;
}

AutoResetEvent m_Event = new AutoResetEvent(false);
Queue<WorkItem> m_Queue = new Queue<WorkItem>();
Thread m_Thread;
bool m_Terminate;
}

来吧,撕开它!

请停止询问我是否需要这个:是的,我需要 - 我有不是线程安全的遗留 C 代码,所以我需要在后台线程上同步我对它的所有调用。

编辑:最后一刻对我的代码所做的更改显然不正确,已修复。

最佳答案

我假设您想要这个,因为您不希望任何这些“作业”同时运行,这看起来像是一个有效的要求。但它与“都在同一个线程上”略有不同。

(Fx4) Task 并行库有一个“ContinuesWith”结构,它解决了一个类似的问题,但接口(interface)不同。

所以我认为您必须(继续)推出自己的产品。一些批评:

您在锁外检查 m_Queue.Count,这可能是安全的,因为您只有 1 个消费者,但我会将其折叠到锁中。

您还可以用 Monitor.Wait() 和 Monitor.Pulse() 替换 AutoResetEvent。这是“更轻量”(所有托管代码)并且它与锁(== Monitor.Enter/.Exit)配合得很好。

关于c# - 在 .NET 的后台线程上运行遗留的、不可重入的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1924230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com