我在将数据加载到后台线程中的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对象还是我的线程错误?
由于
答案 0 :(得分:0)
经过一番研究后,我发现我遇到这个问题的原因。这是因为morechilli发布的STA问题。我正在使用的COM对象只能使用Single Threaded。感谢所有评论