我有包含像這樣的[STAThread]主:跨線程問題,BackgroundWorker的和ReportProgress
try
{
// Start the port enumerator.
Enumerator enumerator = new Enumerator();
// Display the main window and start everything going.
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new TopViewForm(ref enumerator));
}
catch (Exception)
{
}
枚舉對象本身包含一個後臺工作線程。後臺工作被初始化這樣的:現在
MyBackgroundWorker = new BackgroundWorker();
MyBackgroundWorker.WorkerSupportsCancellation = true;
MyBackgroundWorker.WorkerReportsProgress = true;
MyBackgroundWorker.DoWork +=new DoWorkEventHandler(MyBackgroundWorker_DoWork);
MyBackgroundWorker.ProgressChanged += new ProgressChangedEventHandler(MyBackgroundWorker_ProgressChanged);
MyBackgroundWorker.RunWorkerCompleted +=new RunWorkerCompletedEventHandler(MyBackgroundWorker_RunWorkerCompleted);
MyBackgroundWorker.RunWorkerAsync();
,以報告進展情況回主窗體(TopViewForm的情況下),在枚舉線程調用一些適當的用戶對象ReportProgress。我假設ReportProgress將以ProgressChanged事件的形式到達,並在主UI線程上執行,這是Enumerator本身創建的線程(即不是BackgroundWorker的線程)。
鑑於這種情況,當我嘗試在主進程線程的TreeView中設置節點以響應來自此對象的事件時,出現跨線程違例錯誤,該怎麼辦? ProgressChanged明確不是似乎是在主進程線程上運行,看着調用堆棧。
我假設然後,Application.Run生成一個新的線程並運行該表單?但文件中另有說明。要麼我犯了一個愚蠢的錯誤,要麼我在這裏不明白。
有沒有人有任何想法?
一個Bgw與Application.Run()緊密合作,因此將它移動到表單中。 –
好想你們倆。如果我在表單中移動它,它可以正常工作。 – Robinson
那麼,第一個添加它作爲答案得到的點:) – Robinson