我知道您需要使用Dispatcher从工作线程更新UI线程中的项目。为了确认我的理解,当你得到与当前对象相关联的Dispatcher时,如果我的类继承自UserControl类,它总是UI调度程序吗?在哪些情况下它不是UI调度程序?
无论如何,在下面的代码中,我创建了一个查询并异步启动它,当它完成时,它在我的一个UI元素上设置itemsource。我还将项添加到UI元素用作其itemsource的可观察集合中。当它运行时,它工作正常,并不是在使用调度程序并以这种方式更新UI。那是为什么?
private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
QueryTask queryTask = new QueryTask(URL);
queryTask.ExecuteCompleted += new EventHandler<QueryEventArgs>(queryTask_ExecuteCompleted);
queryTask.Failed += new EventHandler<TaskFailedEventArgs>(queryTask_Failed);
Query query = new Query();
query.Where = "Field <> 'XXX'";
query.OutFields.Add("*");
queryTask.ExecuteAsync(query);
BuildingsOrganizationList.ItemsSource = organizationList;
}
void queryTask_ExecuteCompleted(object sender, QueryEventArgs e)
{
FeatureSet featureSet = e.FeatureSet;
foreach (KeyValuePair<string, string> columns in featureSet.FieldAliases)
{
TypeGrid.Columns.Add(new DataGridTextColumn()
{
Header = columns.Key,
Binding = new System.Windows.Data.Binding("Attributes[" + columns.Key + "]"),
CanUserSort = true
});
}
TypeGrid.ItemsSource = featureSet.Features;
TypeBusyIndicator.IsBusy = false;
testing();
}
private void testing()
{
List<string> temp = new List<string>();
temp.Add("Item 1");
temp.Add("Item 2");
temp.Add("Item 3");
foreach (string org in temp)
{
organizationList.Add(org);
}
}
答案 0 :(得分:2)
因为即使处理是异步完成的,您也可以在UI线程中检索结果(事件不是线程),并从那里更新它。
但是,如果您将代码放在queryTask_ExecuteCompleted
中的任务:
Task.Factory.StartNew(() =>
{
//code of queryTask_ExecuteCompleted here
});
你会得到你的例外。
答案 1 :(得分:1)
ExecuteCompleted
事件发生在调用ExecuteAsync
的同一线程上。