2012-01-09 2 views
1

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); 
    } 
} 
+0

別のスレッドからUIを更新する場合は、Dispatcherを使用する必要があります。 ExecuteCompletedはコールバックです。実行しているスレッドの外側からUIに触れているわけではありません。 – Alex

答えて

2

処理は非同期で実行されていても、あなたは(イベントがスレッドではありません)あなたのUIスレッドで結果を取得し、そこからそれを更新しますので。

は場合は、しかし、あなたは、タスクにqueryTask_ExecuteCompleted内のコードを置く:

Task.Factory.StartNew(() => 
{ 
    //code of queryTask_ExecuteCompleted here 
}); 

あなたの例外が発生します。

+0

それでは、私が銀河で非同期呼び出しを行うときにディスパッチャーを使うと言うWeb上の多くの記事はなぜですか?ここのように:http://www.silverlightshow.net/items/Tip-Asynchronous-Silverlight-Execute-on-the-UI-thread.aspx – Justin

+0

ExecuteAsyncでUIを更新する場合は、ディスパッチャを使用する必要があります方法。あなたはそれをしないので、あなたはそれを必要としません。イベントハンドラは既にUIスレッドにあります。 –

+0

ディスパッチャを使用する必要があるコードの例を教えてください。 – Justin

1

ExecuteCompletedイベントは、ExecuteAsyncを呼び出す同じスレッドで発生します。

関連する問題