我正在尝试使用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吗?
任何帮助表示赞赏!
答案 0 :(得分:2)
如果您阅读STAThreadAttribute
文档,则会看到以下注释:
将此属性应用于入口点方法(C#和Visual Basic中的
Main()
方法)。它对其他方法没有影响。要设置您在代码中开始的线程的单元状态,请在启动线程之前使用Thread.SetApartmentState
或Thread.TrySetApartmentState
方法。
所以你必须使用属性标记应用程序入口点(否则你的主线程将进入MTA),或者如果你从另一个线程调用组件,你需要调用Thread.SetApartmentState
来设置线程到线程启动前的STA。
请注意,一旦线程使用COM互操作并进入公寓,线程就无法离开公寓并进入另一个公寓。
如果您正在使用任务或线程池线程,则无法将公寓状态设置为STA。