我知道這是一個老問題。 這是一些代碼。它的工作原理罰款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