在后台线程中加载数据时的UI线程锁定

时间:2013-07-15 13:22:28

标签: c# multithreading winforms com

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

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

我追踪到我的代码并在我的Usercontrol中加载文件的代码中放置了一个通用的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是加载到我的Usercontrol中的COM对象。 usercontrol存在于UI线程中,它在Form Loads时初始化。问题是在UI线程上创建COM对象还是我的线程错误?

由于

1 个答案:

答案 0 :(得分:0)

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