线程失败问题C#

线程失败问题C#,c#,C#,我正在致力于将一个没有任何多线程支持的单线程API集成到一个多线程程序中。我想把所有的API交互都放在主线程上,在其他线程上做其他事情。然而,我正在使用的程序有一个面向生产者和消费者的线程设计(我不能修改) 有没有一种方法可以让线程在需要时切换到主线程?或者其他方法让它工作 我很抱歉不能更清楚地表达问题您可以在工作线程上使用,让它在主用户界面线程上运行一些代码 或者,您可以使用来同步对单线程API的所有访问 更多的细节会更好,但这些都是让你开始的一些想法 编辑:阅读您的评论后,最简单、最轻量级的

我正在致力于将一个没有任何多线程支持的单线程API集成到一个多线程程序中。我想把所有的API交互都放在主线程上,在其他线程上做其他事情。然而,我正在使用的程序有一个面向生产者和消费者的线程设计(我不能修改)

有没有一种方法可以让线程在需要时切换到主线程?或者其他方法让它工作

我很抱歉不能更清楚地表达问题

您可以在工作线程上使用,让它在主用户界面线程上运行一些代码

或者,您可以使用来同步对单线程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、WindowsPhone7、Zune、Xbox360、Windows8Metro等等?它是一个程序API和另一个程序之间相当低级的适配器。顶层是WPFso锁的东西不起作用,但是控件.Invoke在我的实际代码项目控件中起作用了。Invoke不起作用,请参见此