Пример #1
0
        // 外界只能使用靜態方法取得實例
        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);
        }
Пример #2
0
 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);
 }