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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

集合已被修改;枚舉操作可能不會執(zhí)行。

集合已被修改;枚舉操作可能不會執(zhí)行。

慕斯王 2019-06-03 10:05:46
集合已被修改;枚舉操作可能不會執(zhí)行。我無法找到這個錯誤的底部,因為當(dāng)附加調(diào)試器時,它似乎不會發(fā)生。下面是密碼。這是Windows服務(wù)中的WCF服務(wù)器。每當(dāng)有數(shù)據(jù)事件時,服務(wù)都會調(diào)用NotifySubscriber方法(隨機間隔,但不經(jīng)常-每天大約800次)。當(dāng)Windows窗體客戶端訂閱時,訂閱者ID將添加到訂閱者字典中,而當(dāng)客戶端取消訂閱時,它將從字典中刪除。當(dāng)客戶端取消訂閱時(或之后)發(fā)生錯誤。似乎下一次調(diào)用NotifySubscriber()方法時,foreach()循環(huán)會失敗,主題行中的錯誤會導(dǎo)致失敗。該方法將錯誤寫入應(yīng)用程序日志,如下代碼所示。當(dāng)附加調(diào)試器和客戶端取消訂閱時,代碼執(zhí)行良好。你看到這個代碼有問題了嗎?我需要讓字典線程安全嗎?[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]public class SubscriptionServer : ISubscriptionServer{     private static IDictionary<Guid, Subscriber> subscribers;     public SubscriptionServer()     {                     subscribers = new Dictionary<Guid, Subscriber>();     }     public void NotifySubscribers(DataRecord sr)     {         foreach(Subscriber s in subscribers.Values)         {             try             {                 s.Callback.SignalData(sr);             }             catch (Exception e)             {                 DCS.WriteToApplicationLog(e.Message,                    System.Diagnostics.EventLogEntryType.Error);                 UnsubscribeEvent(s.ClientId);             }         }     }     public Guid SubscribeEvent(string clientDescription)     {         Subscriber subscriber = new Subscriber();         subscriber.Callback = OperationContext.Current.                 GetCallbackChannel<IDCSCallback>();         subscribers.Add(subscriber.ClientId, subscriber);         return subscriber.ClientId;     }     public void UnsubscribeEvent(Guid clientId)     {         try         {             subscribers.Remove(clientId);         }         catch(Exception e)         {             System.Diagnostics.Debug.WriteLine("Unsubscribe Error " +                      e.Message);         }     }}
查看完整描述

4 回答

?
神不在的星期二

TA貢獻1963條經(jīng)驗 獲得超6個贊

可能發(fā)生的是SignalData在循環(huán)期間間接地更改訂閱者字典并導(dǎo)致消息。您可以通過更改

foreach(Subscriber s in subscribers.Values)

foreach(Subscriber s in subscribers.Values.ToList())

如果我是對的,問題就會消失

調(diào)用訂閱者,值。ToList()將訂閱者的值復(fù)制到Foreach開頭的單獨列表中。其他任何東西都無法訪問這個列表(它甚至沒有變量名!),所以在循環(huán)中沒有任何東西可以修改它。


查看完整回答
反對 回復(fù) 2019-06-03
?
元芳怎么了

TA貢獻1798條經(jīng)驗 獲得超7個贊

當(dāng)訂閱服務(wù)器取消訂閱時,您將在枚舉期間更改訂閱服務(wù)器集合的內(nèi)容。

有幾種方法可以解決這一問題,其中一種方法是更改for循環(huán)以使用顯式.ToList():

public void NotifySubscribers(DataRecord sr)  {
    foreach(Subscriber s in subscribers.Values.ToList())
    {
                                              ^^^^^^^^^  
        ...


查看完整回答
反對 回復(fù) 2019-06-03
?
月關(guān)寶盒

TA貢獻1772條經(jīng)驗 獲得超5個贊

您還可以鎖定訂閱者字典,以防止當(dāng)它被循環(huán)時被修改:

 lock (subscribers)
 {
         foreach (var subscriber in subscribers)
         {
               //do something
         }
 }


查看完整回答
反對 回復(fù) 2019-06-03
  • 4 回答
  • 0 關(guān)注
  • 921 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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