gpt4 book ai didi

c# - 这怎么不会在Silverlight中引起跨线程异常?

转载 作者:行者123 更新时间:2023-12-03 13:21:22 25 4
gpt4 key购买 nike

我知道您需要使用Dispatcher从工作线程更新UI线程中的项目。为了确认我的理解,如果我的类继承自UserControl类,那么当您获得与当前对象关联的Dispatcher时,它始终是UI调度程序吗?在哪种情况下不是UI调度程序?

无论如何,在下面的代码中,我正在创建一个查询并异步启动它,当查询完成时,它将在我的UI元素之一上设置itemsource。我还将项目添加到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);
}
}

最佳答案

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

但是,如果您将代码放在Task的queryTask_ExecuteCompleted中:

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

您会得到异常(exception)。

关于c# - 这怎么不会在Silverlight中引起跨线程异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8790126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com