例外:调用线程必须是STA,因为许多UI组件都需要这样做

时间:2015-04-26 13:15:13

标签: vb.net

我正在尝试使用OCR工具。此工具从PDF获取文本并将其转换为RTF。

然后我必须将其转换为HTML,所以我使用:

outputText = MarkupConverter.RtfToHtmlConverter.ConvertRtfToHtml(
                System.Text.Encoding.Default.GetString(response.fileData));

我在这一行中设置了一个断点,因为在这一行之后,我得到了一个例外:

  

调用线程必须是STA,因为许多UI组件都需要这个。

所以我试着把<STAThread()>放在函数上面:

<STAThread()>
Public Shared Function GetFileTextByOCRTool(path As String) As String

但它不起作用(我得到同样的例外)..

不是(<STAThread()>)将函数定义为STA吗?

任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

如果您阅读STAThreadAttribute文档,则会看到以下注释:

  

将此属性应用于入口点方法(C#和Visual Basic中的Main()方法)。它对其他方法没有影响。要设置您在代码中开始的线程的单元状态,请在启动线程之前使用Thread.SetApartmentStateThread.TrySetApartmentState方法。

所以你必须使用属性标记应用程序入口点(否则你的主线程将进入MTA),或者如果你从另一个线程调用组件,你需要调用Thread.SetApartmentState来设置线程到线程启动前的STA。

请注意,一旦线程使用COM互操作并进入公寓,线程就无法离开公寓并进入另一个公寓。

如果您正在使用任务或线程池线程,则无法将公寓状态设置为STA。