我在設置主thread
的另一個thread
上設置Property
時出現問題。如何使用另一個線程中的新對象更新屬性?
這是我目前做:
XAML:
<TabControl Name="tab"/>
代碼背後:
TabItem tabItem = new TabItem();
Binding myBinding = new Binding("ReportView") { Source = ViewModel, Mode = BindingMode.TwoWay, UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged };
BindingOperations.SetBinding(tabItem, TabItem.ContentProperty, myBinding);
tab.Items.Add(tabItem);
Thread t = new Thread(DoWork);
t.SetApartmentState(ApartmentState.STA);
t.Priority = ThreadPriority.Normal;
t.Start();
DoWork的方法:
當我創建ReportPreviewView
內身體的Dispatcher.BeginInvoke
,我沒有得到exception
:
public void DoWork(object sender)
{
//I create the relavant ViewModel
ReportViewModel reportViewModel = new ReportViewModel(SessionContext, Mediator, Parent.ReportRequest, false);
Dispatcher.BeginInvoke((Action)(() =>
{
//Create the relevant View
ReportPreviewView reportPreviewView = new ReportPreviewView(reportViewModel) { ReportName = Parent.ReportRequest.Report.ReportName };
ViewModel.ReportView = reportPreviewView;
}));
}
但這是不正確的。它凍結了我的UI thread
。創建ReportPreviewView
需要很長時間才能退出。
於是我移動ReportPreviewView
的創作Dispatcher.BeginInvoke
外:
public void DoWork(object sender)
{
ReportViewModel reportViewModel = new ReportViewModel(SessionContext, Mediator, Parent.ReportRequest, false);
ReportPreviewView reportPreviewView = new ReportPreviewView(reportViewModel) { ReportName = Parent.ReportRequest.Report.ReportName };
Dispatcher.BeginInvoke((Action)(() =>
{
reportLoaderViewModel.ReportView = reportPreviewView;
}));
}
只要PropertyChanged
火我得到以下異常:
調用線程不能訪問此對象,因爲一個不同的線程擁有它
任何想法我可以解決這個問題?
好吧,不知道它有幫助,但是如果你的'ReportPreviewView'拷貝構造函數是輕量級的,你可能只想在'beginInvoke'內創建一個對象的副本並使用它來設置'ReportView'。但我幾乎可以肯定這是行不通的。試試看,這只是一行代碼:) – J0HN
The prequel:http://stackoverflow.com/questions/7553884/instantiating-an-object-in-a-background-worker-causes-the-ui-to - 結冰 –