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包裝你的一些問題代碼,看看你是否可以發現任何東西。 –