මට මෙම දෝෂයේ පහළට යා නොහැක, මන්ද නිදොස්කරණය ඇමිණූ විට එය සිදු වූ බවක් නොපෙනේ.
එකතු කිරීම වෙනස් කරන ලදි; ගණන් ගැනීමේ මෙහෙයුම ක්රියාත්මක නොවිය හැක
පහත දැක්වෙන්නේ කේතයයි.
මෙය වින්ඩෝස් සේවාවක WCF සේවාදායකයකි. NotifySubscribers()
දත්ත සිදුවීමක් ඇති සෑම අවස්ථාවකම මෙම ක්රමය සේවාව විසින් කැඳවනු ලැබේ (අහඹු ලෙස, නමුත් බොහෝ විට නොවේ - දිනකට 800 වතාවක් පමණ).
වින්ඩෝස් පෝරම සේවාදායකයකු දායක වූ විට, ග්රාහක හැඳුනුම්පත ග්රාහක ශබ්දකෝෂයට එකතු වන අතර සේවාදායකයා දායකත්වයෙන් ඉවත් වූ විට එය ශබ්දකෝෂයෙන් මකා දමනු ලැබේ. සේවාදායකයා දායකත්වයෙන් ඉවත් වූ විට (හෝ පසුව) දෝෂය සිදු වේ. ඊළඟ වතාවේ NotifySubscribers()
ක්රමය හැඳින්වූ foreach()
විට විෂය රේඛාවේ දෝෂය සමඟ ලූපය අසමත් වන බව පෙනේ . පහත කේතයෙහි පෙන්වා ඇති පරිදි මෙම ක්රමය මඟින් දෝෂය යෙදුම් ලොගයට ලියයි. නිදොස් කිරීමක් අමුණා ඇති විට සහ සේවාදායකයා දායකත්වයෙන් ඉවත් වූ විට, කේතය හොඳින් ක්රියාත්මක වේ.
මෙම කේතයේ ගැටලුවක් ඔබට පෙනේද? මට ශබ්ද කෝෂය නූල් ආරක්ෂිත කිරීමට අවශ්යද?
[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);
}
}
}