namespace WCFChatService
{
// InstanceContextMode.PerSession 服务器为每个客户会话创建一个新的上下文对象。ConcurrencyMode.Multiple 异步的多线程实例
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, ConcurrencyMode = ConcurrencyMode.Multiple)]
public class ChatService : IChatService
{
private static Object syncObj = new Object();////定义一个静态对象用于线程部份代码块的锁定,用于lock操作
IChatCallback callback = null;
public delegate void ChatEventHandler(object sender, ChatEventArgs e);//定义用于把处理程序赋予给事件的委托。
public static event ChatEventHandler ChatEvent;//定义事件
static Dictionary<string, ChatEventHandler> chatters = new Dictionary<string, ChatEventHandler>();//创建一个静态Dictionary(表示键和值)集合(字典),用于记录在线成员,Dictionary<(Of <(TKey, TValue>)>) 泛型类
private string name;
private ChatEventHandler myEventHandler = null;
public string[] Join(string name)
{
bool userAdded = false;
myEventHandler = new ChatEventHandler(MyEventHandler);//将MyEventHandler方法作为参数传递给委托
lock (syncObj)//线程的同步性,同步访问多个线程的任何变量,利用lock(独占锁),确保数据访问的唯一性。
{
if (!chatters.ContainsKey(name) && name != "" && name != null)
{
this.name = name;
chatters.Add(name, MyEventHandler);
userAdded = true;
}
}
if (userAdded)
{
callback = OperationContext.Current.GetCallbackChannel<IChatCallback>();//获取当前操作客户端实例的通道给IChatCallback接口的实例callback,此通道是一个定义为IChatCallback类型的泛类型,通道的类型是事先服务契约协定好的双工机制。
ChatEventArgs e = new ChatEventArgs();//实例化事件消息类ChatEventArgs
e.msgType = MessageType.UserEnter;