Tôi không thể đi đến tận cùng của lỗi này, bởi vì khi trình gỡ lỗi được đính kèm, nó dường như không xảy ra. Dưới đây là mã.
Đây là một máy chủ WCF trong một dịch vụ Windows. Phương thức NotifySubscribe được dịch vụ gọi bất cứ khi nào có sự kiện dữ liệu (theo các khoảng thời gian ngẫu nhiên, nhưng không thường xuyên - khoảng 800 lần mỗi ngày).
Khi ứng dụng khách Windows Forms đăng ký, ID thuê bao sẽ được thêm vào từ điển của người đăng ký và khi khách hàng hủy đăng ký, nó sẽ bị xóa khỏi từ điển. Lỗi xảy ra khi (hoặc sau) một khách hàng hủy đăng ký. Có vẻ như lần sau khi phương thức NotifySubscribeers () được gọi, vòng lặp foreach () không thành công với lỗi trong dòng chủ đề. Phương thức ghi lỗi vào nhật ký ứng dụng như trong đoạn mã dưới đây. Khi trình gỡ lỗi được đính kèm và máy khách hủy đăng ký, mã sẽ thực thi tốt.
Bạn có thấy một vấn đề với mã này? Tôi có cần làm cho chủ đề từ điển an toàn không?
[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);
}
}
}