這就是我的那一刻,但是當我打電話Dispatcher.BeginInvoke()
,我的UI死機:在後臺工作實例化對象使UI凍結了
BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.WorkerSupportsCancellation = true;
backgroundWorker.WorkerReportsProgress = true;
ViewModel.GenerateReport(backgroundWorker, Dispatcher);
視圖模型:
backgroundWorker.DoWork += delegate(object s, DoWorkEventArgs args)
{
try
{
ReportViewModel reportViewModel = new ReportViewModel(SessionContext, Mediator, reportDashboardViewModel.ReportRequest, false);
dispatcher.BeginInvoke((Action)(() =>
{
ReportPreviewView reportPreviewView = new ReportPreviewView(reportViewModel);
reportPreviewView.ReportName = reportDashboardViewModel.ReportRequest.Report.ReportName;
ReportView = reportPreviewView;
}));
}
catch (Exception exception)
{
backgroundWorker.ReportProgress(0, "There Was an Error generating the report");
backgroundWorker.CancelAsync();
throw;
}
};
backgroundWorker.RunWorkerAsync();
在dispatcher.BeginInvoke
的第一行會導致我的UI
凍結起來。 ReportPreviewView reportPreviewView = new ReportPreviewView(reportViewModel);
注意:ReportPreviewView
創建報告請求相關視圖。可能是Devexpress
,C1
或pivot reports
。
,只要我取出dispatcher.BeginInvoke
,我得到這個錯誤:
The calling thread must be STA, because many UI components require this.
所以我的問題是,我需要做什麼來解決這個問題?
使用BackgroundWorker
的全部原因是我的UI
始終保持響應。
我是新來multithreading
,所以也許我得到了結構中的所有錯誤......
的可能重複[我怎樣才能讓一個後臺工作線程設置爲單線程公寓?](http://stackoverflow.com/questions/4685237/how-can-i-make-a-background-worker-thread -set-to-single-thread-apartment) –
在DoWork中使用BeginInvoke否定Bgw。 'new ReportPreviewView()'在主線程上執行。所以是的,這可以掛你的桂。 –
@亨克霍爾特曼:謝謝你的迴應。你建議我應該做什麼? – Willem