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

C# 在后台线程中加载数据时UI线程锁定,c#,multithreading,winforms,com,C#,Multithreading,Winforms,Com,我在后台线程中将数据加载到COM对象时遇到问题 我有一些文件需要很长时间才能加载,当这种情况发生时,我的应用程序会被锁定,无法使用。因此,我尝试在后台线程中加载数据,BackgroundWorkerobject 我追踪到我的代码,并为加载文件的Usercontrol在代码隐藏中放置了一个通用的Thread.Sleep()。我可以在Sleep()调用期间使用该应用程序,但当我将Sleep()调用替换为我的LoadFile()调用时,它会锁定UI线程 下面是我调用的代码的简化版本: private

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

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

我追踪到我的代码,并为加载文件的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);
}
AxixCtrl_查看器是加载到我的Usercontrol中的COM对象。usercontrol位于UI线程中,在加载表单时初始化它。问题是与在UI线程上创建COM对象有关,还是我的线程错误


谢谢

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

可能是STA问题—您的COM对象在主线程上执行其所有方法—请参阅发布的代码。我们是否可以查看
加载文件的内容以查看
?何时调用showFile?不确定,因为您没有显示代码的这一部分,但您可能会在BackgroundWorker完成后调用它。我相信默认情况下会有一个存根,RunWorkerCompleted。另外,您确定在调用COM函数时没有输入不匹配吗?您说过线程会锁定,所以这可能没有用,但请尝试使用try catch包装一些问题代码,看看是否可以发现任何问题。LoadFileForView()只做一个简单的文件。Exist()在将sting发送到showFile()之前,请检查文件路径是否存在在用户控件内部,用户界面线程正在调用对
axoixctrl\u Viewer.ViewFile
的调用。