第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何通過(guò)工作線程更新觀察者集合?

如何通過(guò)工作線程更新觀察者集合?

C#
有只小跳蛙 2019-07-27 15:15:57
如何通過(guò)工作線程更新觀察者集合?我有一個(gè)ObservableCollection<A> a_collection;集合包含“n”項(xiàng)。每一項(xiàng)A如下所示:public class A : INotifyPropertyChanged{     public ObservableCollection<B> b_subcollection;     Thread m_worker;}基本上,它都連接到一個(gè)WPF列表視圖+一個(gè)細(xì)節(jié)視圖控件,該控件在單獨(dú)的listview(雙向綁定、屬性更改更新等)中顯示所選項(xiàng)的b_子集合。當(dāng)我開(kāi)始實(shí)現(xiàn)線程時(shí),問(wèn)題就出現(xiàn)了。整個(gè)想法是讓整個(gè)a_集合使用它的輔助線程“做工作”,然后更新它們各自的b_子集合,讓gui實(shí)時(shí)顯示結(jié)果。當(dāng)我嘗試它時(shí),我得到了一個(gè)異常,它說(shuō)只有Dispatcher線程才能修改一個(gè)觀測(cè)者集合,然后工作就停止了。有誰(shuí)能解釋這個(gè)問(wèn)題,以及如何解決這個(gè)問(wèn)題?干杯
查看完整描述

3 回答

?
翻翻過(guò)去那場(chǎng)雪

TA貢獻(xiàn)2065條經(jīng)驗(yàn) 獲得超14個(gè)贊

從技術(shù)上講,問(wèn)題不是要從后臺(tái)線程中更新觀測(cè)者集合。問(wèn)題是,當(dāng)您這樣做時(shí),集合會(huì)在導(dǎo)致更改的同一線程上引發(fā)它的Collection Changed事件-這意味著正在從后臺(tái)線程更新控件。

為了在控件綁定到后臺(tái)線程時(shí)從后臺(tái)線程填充集合,您可能需要從頭創(chuàng)建自己的集合類型來(lái)解決這個(gè)問(wèn)題。不過(guò),有一個(gè)更簡(jiǎn)單的選擇可能適合你。

將添加調(diào)用發(fā)布到UI線程。

public static void AddOnUI<T>(this ICollection<T> collection, T item) {
    Action<T> addMethod = collection.Add;
    Application.Current.Dispatcher.BeginInvoke( addMethod, item );}...b_subcollection.AddOnUI(new B());

此方法將立即返回(在項(xiàng)目實(shí)際添加到集合之前),然后在UI線程上,項(xiàng)目將被添加到集合中,每個(gè)人都應(yīng)該很高興。

然而,現(xiàn)實(shí)情況是,由于所有的跨線程活動(dòng),這種解決方案很可能會(huì)在沉重的負(fù)荷下陷入困境。一個(gè)更有效的解決方案是對(duì)一組項(xiàng)目進(jìn)行批處理,并定期將它們發(fā)布到UI線程中,這樣您就不會(huì)為每個(gè)項(xiàng)目跨線程進(jìn)行調(diào)用。

這個(gè)背景工作者類實(shí)現(xiàn)了允許您通過(guò)其報(bào)告進(jìn)度方法在后臺(tái)操作期間。進(jìn)度通過(guò)ProgressChanged事件報(bào)告在UI線程上。這可能是你的另一個(gè)選擇。




查看完整回答
反對(duì) 回復(fù) 2019-07-29
?
桃花長(zhǎng)相依

TA貢獻(xiàn)1860條經(jīng)驗(yàn) 獲得超8個(gè)贊

.NET 4.5的新選項(xiàng)

從.NET 4.5開(kāi)始,有一個(gè)內(nèi)置機(jī)制來(lái)自動(dòng)同步對(duì)集合和分派的訪問(wèn)CollectionChanged事件到UI線程。要啟用此功能,需要調(diào)用BindingOperations.EnableCollectionSynchronization 在您的UI線程中.

EnableCollectionSynchronization做兩件事:

  1. 記住調(diào)用它的線程,并導(dǎo)致數(shù)據(jù)綁定管道封送處理。

    CollectionChanged

    線程上的事件。
  2. 在處理封送事件之前獲取集合上的鎖,以便運(yùn)行UI線程的事件處理程序在從后臺(tái)線程修改集合時(shí)不會(huì)嘗試讀取集合。

非常重要的是,這并不能解決所有的問(wèn)題。*確保線程安全訪問(wèn)固有的非線程安全集合。你必須合作通過(guò)從后臺(tái)線程獲取相同的鎖來(lái)使用框架,當(dāng)集合即將被修改時(shí)。

因此,正確操作所需的步驟如下:

1.決定使用哪種鎖

這將確定EnableCollectionSynchronization一定要用。大多數(shù)時(shí)候很簡(jiǎn)單lock這樣的話就足夠了這種過(guò)載是標(biāo)準(zhǔn)的選擇,但是如果您使用的是一些花哨的同步機(jī)制,那么支持自定義鎖.

2.創(chuàng)建集合并啟用同步

根據(jù)選擇的鎖機(jī)制,調(diào)用適當(dāng)?shù)闹剌d。在UI線程上..如果使用標(biāo)準(zhǔn)lock語(yǔ)句,則需要將LOCK對(duì)象作為參數(shù)提供。如果使用自定義同步,則需要提供CollectionSynchronizationCallback委托和上下文對(duì)象(可以是null)。調(diào)用時(shí),此委托必須獲取自定義鎖,然后調(diào)用Action傳遞給它并在返回前釋放鎖。

3.合作,在修改之前鎖定集合

您還必須在自己修改集合時(shí)使用相同的機(jī)制鎖定集合;lock()在傳遞給EnableCollectionSynchronization在簡(jiǎn)單場(chǎng)景中,或者在自定義場(chǎng)景中使用相同的自定義同步機(jī)制。


查看完整回答
反對(duì) 回復(fù) 2019-07-29
?
元芳怎么了

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超7個(gè)贊

使用.NET 4.0,您可以使用以下一行程序:

.Add

Application.Current.Dispatcher.BeginInvoke(new Action(() => this.MyObservableCollection.Add(myItem)));

.Remove

Application.Current.Dispatcher.BeginInvoke(new Func<bool>(() => this.MyObservableCollection.Remove(myItem)));





查看完整回答
反對(duì) 回復(fù) 2019-07-29
  • 3 回答
  • 0 關(guān)注
  • 283 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)