我正在将没有任何多线程支持的单线程API集成到多线程程序中。我想在主线程上保留所有的API交互,并在其他线程上做其他事情。但是我正在使用的程序有一个生产者 - 消费者导向的线程设计(我不能修改)。线程失败问题C#
有没有办法让线程切换到主线程时,我想?或者其他方式来使它工作?
我不能够表达这个问题更清楚
我正在将没有任何多线程支持的单线程API集成到多线程程序中。我想在主线程上保留所有的API交互,并在其他线程上做其他事情。但是我正在使用的程序有一个生产者 - 消费者导向的线程设计(我不能修改)。线程失败问题C#
有没有办法让线程切换到主线程时,我想?或者其他方式来使它工作?
我不能够表达这个问题更清楚
您可以使用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
}
这通常是调用非线程安全代码的可接受方式。
您可以尝试使用(通常)由一个“主”线程处理的窗口消息。创建一个窗口,向客户端展示模拟API方法的包装,并在内部发送窗口消息。处理窗口消息时,请调用您的实际实现。
这就是COM单线程公寓模型的工作方式,它解决了完全相同的问题。但是,这是相当先进的解决方案。
不能重构代码以使其线程安全吗?我认为这会更简单。
这是什么类型的应用程序? WinForms,WPF,ASP.NET,Silverlight,Windows Phone 7,Zune,XBox 360,Windows 8 Metro,......? –
IT是一个程序API和另一个程序之间相当低级的适配器。顶层是WPF – Brent