0

我在后台线程中将数据加载到 COM 对象时遇到问题。

我有一些文件需要很长时间才能加载,当这种情况发生时,我的应用程序会锁定并变得无法使用。因此,我试图将数据加载到后台线程BackgroundWorker对象中。

我跟踪了我的代码,并Thread.Sleep()为正在加载文件的用户控件放置了一个通用代码。我可以在Sleep()通话期间使用该应用程序,但是当我Sleep()用我的LoadFile()通话替换通话时,它会锁定 UI 线程。

这是我正在调用的代码的简化版本:

private void CurrentDocumentChangedEvents()
{
    //fire event for native file viewer

    var worker = new BackgroundWorker();

    worker.DoWork += worker_DoWork;

    worker.RunWorkerAsync();

    gridView1.Focus();          
}

void worker_DoWork(object sender, DoWorkEventArgs e)
{
    //Call to UserControl to load the file selected.
    LoadFileForViewing(filePath);
}

public void showFile(string filePath)
{
    //Method inside UserControl that loads my selected file
    Thread.Sleep(10000);

     //axoixctrl_Viewer.ViewFile(false, filePath);
}

axoixctrl_Viewer 是加载到我的用户控件中的 COM 对象。用户控件位于 UI 线程中,它在表单加载时被初始化。问题与在 UI 线程上创建 COM 对象有关还是我的线程错误?

谢谢

4

1 回答 1

0

经过一番研究,我发现了我遇到这个问题的原因。这是因为 morechilli 发布的 STA 问题。我使用的 COM 对象只能使用单线程。感谢所有的评论

于 2013-08-05T18:03:33.650 回答