2013-07-15 33 views
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对象还是我的线程错误?

谢谢

+2

可能的STA的问题 - 在您的COM对象执行它的主线程上的所有方法 - 看http://stackoverflow.com/q/804968/5427 – morechilli

+0

张贴的代码是好的。我们可以看到'LoadFileForViewing'的内容吗? – JosephHirn

+0

什么时候showFile被调用?不确定,因为你没有显示代码的一部分,但大概你会在BackgroundWorker完成后调用它。我相信默认情况下,它有一个存根,RunWorkerCompleted。另外,当你调用COM函数时,你确定没有打字错误吗?你说线程锁定,所以这可能不是有用的,但尝试用try catch包装你的一些问题代码,看看你是否可以发现任何东西。 –

回答

0

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

相关问题