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; } }
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); } }
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); }
public void NonStopRunStop() { CtkUtil.DisposeTaskTry(this.runningTask); this.runningTask = null; }
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)); }
public void SaveXml(string fn) { CtkUtil.SaveXmlToFile(this, fn); }
public static T LoadXml <T>(string fn) where T : class, new() { return(CtkUtil.LoadXmlFromFileOrDefault <T>(fn)); }