我正在努力将没有任何多线程支持的单线程API集成到多线程程序中。我想在主线程上保留所有API交互,并在其他线程上执行其他操作。但是,我正在使用的程序具有面向生产者 - 消费者的线程设计(我无法修改)。
有什么办法可以让线程切换到主线程吗?或者其他一些方法让它发挥作用?
我为无法更清楚地表达问题而道歉
答案 0 :(得分:1)
您可以在工作线程上使用Control.Invoke让它在主用户界面线程上运行一些代码。
或许您可以使用lock同步对单线程API的所有访问权限?
更多细节会很棒,但这些是一些让你入门的想法。
编辑:阅读完评论后,最简单的&如前所述,最轻量级的方法是使用锁同步。这样,一次只有一个线程调用第三方API。例如:
static object APILock = new object(); // global variable
// Do this anytime you need to make calls on this non-thread-safe API:
lock (APILock) {
// call the API; only one thread will run code inside the lock at a time
}
这通常是调用非线程安全代码的可接受方式。
答案 1 :(得分:0)
您可以尝试使用(通常)由一个“主”线程处理的窗口消息。创建一个窗口,向客户端公开模拟API方法的包装器,并在内部发送窗口消息。处理窗口消息时,请调用实际的实现。
这就是COM单线程单元模型的工作方式,它解决了完全相同的问题。但是,这是非常先进的解决方案。
为了使其线程安全,您的代码不能被重构吗?我认为这会更简单。