0
我在将数据加载到后台线程中的COM对象时遇到了问题。当在后台线程中加载数据时UI线程锁定
我所花费很长的时间来加载一些文件,遇到这种情况时我的应用程序锁定,并且变得不可用。正因为如此,我正试图在后台线程中加载数据,BackgroundWorker
对象。
我跟踪到我的代码和代码放在一个通用的Thread.Sleep()
背后我的用户正在加载的文件。我可以在Sleep()
通话期间使用该应用程序,但当我用LoadFile()
呼叫替换Sleep()
时,它会锁定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对象还是我的线程错误?
谢谢
可能的STA的问题 - 在您的COM对象执行它的主线程上的所有方法 - 看http://stackoverflow.com/q/804968/5427 – morechilli
张贴的代码是好的。我们可以看到'LoadFileForViewing'的内容吗? – JosephHirn
什么时候showFile被调用?不确定,因为你没有显示代码的一部分,但大概你会在BackgroundWorker完成后调用它。我相信默认情况下,它有一个存根,RunWorkerCompleted。另外,当你调用COM函数时,你确定没有打字错误吗?你说线程锁定,所以这可能不是有用的,但尝试用try catch包装你的一些问题代码,看看你是否可以发现任何东西。 –