无法实例化,因为当前线程不在单线程单元中

时间:2014-02-28 15:33:11

标签: c# multithreading pdf

因此,虽然我收到此错误cannot be instantiated because the current thread is not in a single-threaded apartment.并且还有其他答案,但我仍然遇到同样的问题,也许我的实施问题是: -

我有一个主要的应用程序,现在我们称之为“Core”并假设为了参数它有一个如下调用: -

Pdf.Generate.Create(file, savepath);

Pdf是解决方案中的类库(dll),它仅包含以下代码: -

using System.Threading;
using Spire.Pdf;

namespace Pdf
{
    public class Generate
    {
        public static void Create(string urltoconvert, string savepath)
        {
            var doc = new PdfDocument();
            var thread = new Thread(() => doc.LoadFromHTML(urltoconvert, false, true, true));
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            thread.Join();
            doc.SaveToFile(savepath);
            doc.Close();
            System.Diagnostics.Process.Start(savepath);
        }
    }
}

我在Pdf电话上LoadFromHTML会收到错误。我已发布在Spire.PDF boards just-in-case上,但我认为这可能是因为我试图呼叫Create。我不明白错误,这就是我发布的原因 - 不只是寻找答案,还有一些理解!

一如既往,感谢您的帮助。

4 个答案:

答案 0 :(得分:1)

为什么不使用相同的线程而不是将工作委托给另一个线程而只是等待它完成?

public static void Create(string urltoconvert, string savepath)
{
    var doc = new PdfDocument();
    doc.LoadFromHTML(urltoconvert, false, true, true);
    doc.SaveToFile(savepath);
    doc.Close();
    System.Diagnostics.Process.Start(savepath);
}

答案 1 :(得分:1)

这根本不是一个多线程问题。对不起大家。通常,一旦我开始使用我发布后安装的日志记录(log4net),我发现该文件的路径是错误的。虽然错误完全是误导,但问题是没有文件可供阅读。我给那些花时间回答的人给了+1。

答案 2 :(得分:0)

您应该在调用LoadFromHTML的同一线程上创建PDF文档。 PDF生成器可能在内部使用单个单元COM对象,这会引发异常。

答案 3 :(得分:0)

试试这个:

 public static void Create(string urltoconvert, string savepath)
        {
 this.BeginInvoke((System.Threading.ThreadStart)delegate()
            {
            var doc = new PdfDocument();
            var thread = new Thread(() => doc.LoadFromHTML(urltoconvert, false, true, true));
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start();
            thread.Join();
            doc.SaveToFile(savepath);
            doc.Close();
            System.Diagnostics.Process.Start(savepath);

 });
        }