这怎么不会在silverlight中引起跨线程异常呢

本文关键字:线程 异常 silverlight | 更新日期: 2023-09-27 18:19:46

我知道您需要使用Dispatcher从工作线程更新UI线程中的项目。为了证实我的理解,当您获得与当前对象关联的Dispatcher时,如果我的类继承自UserControl类,它是否总是UI调度器?在哪些情况下它不是UI调度器?

无论如何,在下面的代码中,我将创建一个查询并异步启动它,当它完成时,它将在我的一个UI元素上设置项源。我还将项目添加到一个可观察的集合中,UI元素将该集合用作其项目源。当它运行时,它工作得很好,并且不会因为我使用调度器和以这种方式更新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);
    }
}

这怎么不会在silverlight中引起跨线程异常呢

因为即使处理是异步完成的,您也可以在UI线程(事件不是线程)中检索结果,并从那里更新它。

但是,如果您将代码放入任务中的queryTask_ExecuteCompleted中:

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

你会得到你的例外。

ExecuteCompleted事件发生在调用ExecuteAsync的同一线程上。