Dispatcherを使用して、UIスレッドのアイテムをワーカースレッドから更新する必要があることにご注意ください。私の理解を確認するために、現在のオブジェクトに関連付けられたディスパッチャを取得するときは、自分のクラスがUserControlクラスから継承する場合、常にUIディスパッチャですか?どのケースではUIディスパッチャではありませんか?Silverlightでクロススレッド例外が発生しない方法はありますか?
とにかく、次のコードでは、クエリを作成して非同期に開始していますが、完了するとitems要素が自分のUI要素の1つに設定されます。私はまた、UI要素がitemourceとして使用するobservableコレクションにアイテムを追加しています。これが実行されると、正常に動作し、ディスパッチャーを使用して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);
}
}
別のスレッドからUIを更新する場合は、Dispatcherを使用する必要があります。 ExecuteCompletedはコールバックです。実行しているスレッドの外側からUIに触れているわけではありません。 – Alex