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