集合已被修改;枚舉操作可能不會執(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個贊
foreach(Subscriber s in subscribers.Values)
foreach(Subscriber s in subscribers.Values.ToList())

元芳怎么了
TA貢獻1798條經(jīng)驗 獲得超7個贊
.ToList()
:
public void NotifySubscribers(DataRecord sr) { foreach(Subscriber s in subscribers.Values.ToList()) { ^^^^^^^^^ ...

月關(guān)寶盒
TA貢獻1772條經(jīng)驗 獲得超5個贊
lock (subscribers) { foreach (var subscriber in subscribers) { //do something } }
- 4 回答
- 0 關(guān)注
- 921 瀏覽
添加回答
舉報
0/150
提交
取消