// 外界只能使用靜態方法取得實例 public static SocketClient GetInstance(string _MeetingID, string _UserID, string _UserName, bool InitToSync) { bool SyncServerIsIP = false; IPAddress ip = default(IPAddress); IPAddress.TryParse(new Uri(WsTool.GetSyncServer_URL()).DnsSafeHost, out ip); if (IPAddress.Equals(default(IPAddress), ip) == false) { SyncServerIsIP = true; } if (SyncServerIsIP == false && NetworkTool.GetDomainNameIP(WsTool.GetSyncServer_URL(), 1000).Equals("") == true && NetworkTool.GetDomainNameIP(WsTool.GetSyncServerImp_URL(), 1000).Equals("") == true) { return(null); } // 先判斷目前有沒有實例,沒有的話才開始 lock, // 此次的判斷,是避免在有實例的情況,也執行 lock ,影響效能 if (instance == null) { // 避免多執行緒可能會產生兩個以上的實例,所以 lock lock (thisLock) { // lock 後,再判斷一次目前有無實例 // 此次的判斷,是避免多執行緒,同時通過前一次的 null == instance 判斷 if (instance == null) { Init_Instance(_MeetingID, _UserID, _UserName, InitToSync); } else { if (MeetingID.Equals(_MeetingID) == false) { Init_Instance(_MeetingID, _UserID, _UserName, InitToSync); } else { int i = 1; while (i <= 10) { bool IsConnected = instance.GetIsConnected(); if (instance != null && IsConnected == true) { break; } else if (i == 10) { Init_Instance(_MeetingID, _UserID, _UserName, InitToSync); } Thread.Sleep(10); i++; } } } } } else { lock (thisLock) { // lock 後,再判斷一次目前有無實例 // 此次的判斷,是避免多執行緒,同時通過前一次的 null == instance 判斷 if (instance == null) { Init_Instance(_MeetingID, _UserID, _UserName, InitToSync); } else { if (MeetingID.Equals(_MeetingID) == false) { Init_Instance(_MeetingID, _UserID, _UserName, InitToSync); } else { //if (instance.GetIsConnected() == false) // Init_Instance(_MeetingID, _UserID, _UserName, InitToSync); int i = 1; while (i <= 10) { bool IsConnected = instance.GetIsConnected(); if (instance != null && IsConnected == true) { break; } else if (i == 10) { Init_Instance(_MeetingID, _UserID, _UserName, InitToSync); } Thread.Sleep(10); i++; } } } } } //Thread.Sleep(100); return(instance); }
public static SocketClient GetInstance(string _MeetingID, string _UserID, string _UserName, bool InitToSync) { if (NetworkTool.GetDomainNameIP(WsTool.GetSyncServer_URL(), 1000).Equals("") && NetworkTool.GetDomainNameIP(WsTool.GetSyncServerImp_URL(), 1000).Equals("")) { return(null); } if (instance != null) { lock (thisLock) { if (instance == null) { Init_Instance(_MeetingID, _UserID, _UserName, InitToSync); } else if (!MeetingID.Equals(_MeetingID)) { Init_Instance(_MeetingID, _UserID, _UserName, InitToSync); } else { for (int i = 1; i <= 10; i++) { bool isConnected = instance.GetIsConnected(); if (instance != null && isConnected) { break; } if (i == 10) { Init_Instance(_MeetingID, _UserID, _UserName, InitToSync); } Thread.Sleep(10); } } } } else { lock (thisLock) { if (instance == null) { Init_Instance(_MeetingID, _UserID, _UserName, InitToSync); } else if (!MeetingID.Equals(_MeetingID)) { Init_Instance(_MeetingID, _UserID, _UserName, InitToSync); } else { for (int j = 1; j <= 10; j++) { bool isConnected2 = instance.GetIsConnected(); if (instance != null && isConnected2) { break; } if (j == 10) { Init_Instance(_MeetingID, _UserID, _UserName, InitToSync); } Thread.Sleep(10); } } } } return(instance); }