示例#1
0
        protected virtual void DisposeSelf()
        {
            /* [d20210220]
             * 沒人參考它時,  有機率被釋放
             * 但其參考的 Task, 其實還沒完工
             * 1. 若此 Task 只是沒人參考, 不應強制Dispose
             * 2. 若此 Task 是應用程式結束時, 應被強制關閉
             * 原生Task選擇不關閉, 應自主結束
             * 但這邊考量的是應正確釋放資源
             *
             * 或許原生才是對的, 你不應強制關閉Task,
             * (1) 該Task要有自主判斷停止的功能,
             * (2) 應用程式強制關閉時, 其實Task也會被關閉
             * 所以, 若你要用一個不受控的Task, 那不如用原生的
             *
             *
             * 結論: 其實原生Task 你也沒辦法強制關閉它, 你也只能直接Try/Catch起來
             * [d20211230] 最好是 應用的代碼 可以確保在一段時間內可以進入下個迴圈
             */



            if (this.Task != null)
            {
                if (this.Status < TaskStatus.RanToCompletion)
                {
                    this.CancelTokenSource.Cancel();
                }
                CtkUtil.DisposeTask(this.Task, this.DisposeWaitTime);//統一Dispose的方法, 有例外仍舊扔出, 確保在預期內
                this.Task = null;
            }
        }
示例#2
0
 public void Disconnect()
 {
     CtkUtil.DisposeTaskTry(this.runningTask);
     CtkNetUtil.DisposeTcpClientTry(this.MyTcpClient);
     this.OnDisconnect(new CtkNonStopTcpStateEventArgs()
     {
         Message = "Disconnect method is executed"
     });
 }
        public void UpdateFromFolder(string folder = null)
        {
            this.Folder = folder == null ? this.Folder : folder;//Folder不得為空, 所以傳空值就保留原本的

            this.LastUpdate = DateTime.Now;

            //記錄現有的
            var orignalConfigs = new Dictionary <String, Boolean>();

            foreach (var name in this.Keys)
            {
                orignalConfigs[name] = false;
            }

            var di = new DirectoryInfo(this.Folder);

            if (!di.Exists)
            {
                di.Create();
            }
            foreach (var fi in di.GetFiles())
            {
                if (this.Filter != null)
                {
                    if (!Filter(fi.Name))
                    {
                        continue;                  //沒通過就不加入
                    }
                }
                try
                {
                    var config = CtkUtil.LoadXmlFromFileOrDefault <T>(fi.FullName);
                    this[fi.Name] = config;
                }
                catch (Exception ex) { CtkLog.WriteNs(this, ex.Message); }

                //更新存在的
                orignalConfigs[fi.Name] = true;
            }


            //移除沒更新到的
            foreach (var kv in orignalConfigs)
            {
                if (kv.Value)
                {
                    continue;
                }
                this.Remove(kv.Key);
            }
        }
示例#4
0
        public static SortedDictionary <Guid, Type> LoadTypeMap(Func <string, bool> filter = null)
        {
            var collector   = new SortedDictionary <Guid, Type>();
            var qAssemblies = AppDomain.CurrentDomain.GetAssemblies();


            foreach (var assem in qAssemblies)
            {
                var qTypes = assem.GetTypes().ToList();

                foreach (var t in qTypes)
                {
                    if (filter != null && !filter(t.FullName))
                    {
                        continue;
                    }

                    var fullname = t.FullName;

                    //Console.WriteLine(fullname);

                    var guid_attrs = t.GetCustomAttributes(typeof(GuidAttribute), false);
                    var guid       = CtkUtil.TypeGuid(t);
                    if (guid == null)
                    {
                        continue;
                    }
                    if (collector.ContainsKey(guid.Value))
                    {
                        //var t2 = collector[guid.Value];
                        //throw new Exception(string.Format("Type {0} and {1} have same Guid", t.FullName, t2.FullName));
                    }

                    collector[guid.Value] = t;
                }
            }
            return(collector);
        }
示例#5
0
 public void NonStopRunStop()
 {
     CtkUtil.DisposeTaskTry(this.runningTask);
     this.runningTask = null;
 }
示例#6
0
 public void SaveToXmlFile(string fn)
 {
     CtkUtil.SaveToXmlFileT(this, fn);
 }
 public static T LoadXml <T>(string fn) where T : class, new()
 {
     return(CtkUtil.LoadXmlOrNew <T>(fn));
 }
示例#8
0
 public void SaveXml(string fn)
 {
     CtkUtil.SaveXmlToFile(this, fn);
 }
示例#9
0
 public static T LoadXml <T>(string fn) where T : class, new()
 {
     return(CtkUtil.LoadXmlFromFileOrDefault <T>(fn));
 }