2011-09-19 116 views
0

我正在将没有任何多线程支持的单线程API集成到多线程程序中。我想在主线程上保留所有的API交互,并在其他线程上做其他事情。但是我正在使用的程序有一个生产者 - 消费者导向的线程设计(我不能修改)。线程失败问题C#

有没有办法让线程切换到主线程时,我想?或者其他方式来使它工作?

我不能够表达这个问题更清楚

+4

这是什么类型的应用程序? WinForms,WPF,ASP.NET,Silverlight,Windows Phone 7,Zune,XBox 360,Windows 8 Metro,......? –

+0

IT是一个程序API和另一个程序之间相当低级的适配器。顶层是WPF – Brent

回答

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 
} 

这通常是调用非线程安全代码的可接受方式。

+0

所以锁的东西没有工作,但Control.Invoke工作很好 – Brent

+0

在我的实际代码项目Control.Invoke不起作用,看到这个[问题](http://stackoverflow.com/questions/7517608 /控制调用-并 - 不存在 - 在最当前上下文) – Brent

0

您可以尝试使用(通常)由一个“主”线程处理的窗口消息。创建一个窗口,向客户端展示模拟API方法的包装,并在内部发送窗口消息。处理窗口消息时,请调用您的实际实现。

这就是COM单线程公寓模型的工作方式,它解决了完全相同的问题。但是,这是相当先进的解决方案。

不能重构代码以使其线程安全吗?我认为这会更简单。