我知道这是一个老问题。 这是一些代码。它的工作原理罚款BindingOperations.EnableCollectionSynchronization(Quotes, _stocksLock);
如何异步更新到ObservableCollection项目?
private void _source_QuoteArrived(Quote Q)
{
Quotes.Add(Q);
}
问题1:在XAML文件有列表视图与Quotes
结合。但为什么在这里发生跨线程?我对跨线程的理解只有在你明确地做到的时候才会发生。像下面的例子。当您明确使用UI元素(此处为label1
)时,会发生交叉线程错误。但是我在这里使用的数据绑定是双向的。为什么我需要EnableCollectionSynchronization
?
private void button1_Click(object sender, EventArgs e)
{
HttpClient client = new HttpClient();
string result = client.GetStringAsync("http://microsoft.com");
label1.Text = result;
}
Quetion 2:假设存在一个数据绑定上述button1_Click
例子可以用async await
来解决,但为什么我不能做某事相似只是用async await
private async void _source_QuoteArrived(Quote Q)
{
await Task.Run(() => Quotes.Add(Q));
}
更新列表视图错扣?在gui中。我用corss线程错误试了一下。
我以为我搞砸了一些概念。 Plz的帮助。
你的第二个代码示例不应该编译。 'GetStringAsync'返回一个'Task'。由于您不使用'await',编译器应该会发出错误。 –
2014-10-10 08:07:14
@YuvalItzchakov真。让我清楚,第二个代码与其他代码无关。我只是想说明什么时候我认为跨线程发生。我不知道为什么它与数据绑定的情况相同。为什么'等待Task.Run(()=> Quotes.Add(Q));'没有解决问题。 – baozi 2014-10-10 09:35:38