private static void Execute(Command.ICommand cmd) { cmd.Execute(); // Adding empty line separator. Logger.PrintLine(); // Exiting as -q (--quite) option is set. if (((Command.IQuite)cmd).Quite) { Environment.Exit(0); } }
private void CommandHandler(object sender, System.EventArgs e) { string[] names = new string[0]; if (sender is ToolStripItem item) { names = item.Name.Split('_'); } else if (sender is Control control) { names = control.Name.Split('_'); } if (names.Length > 1) { System.Reflection.Assembly assem = typeof(MainForm).Assembly; System.Type t = assem.GetType(string.Format("AssetPacker.Command.{0}", names[1])); if (t != null) { Command.ICommand command = (Command.ICommand)System.Activator.CreateInstance(t, this); command.Execute(); } } }
/** 异步工作任务函数 */ private void __WorkFunc(object param) { CancellationTokenSource cts = param as CancellationTokenSource; while (!cts.IsCancellationRequested) { #region 检查是否有可读的要处理 List <TSession> session_to_deal = new List <TSession>(); lock (_dic_sessions_lock) { if (_dic_sessions_idel.Count > 0) { string[] keys = _dic_sessions_idel.Keys.ToArray(); foreach (var key in keys) { TSession sessin = _dic_sessions_idel[key]; if (!sessin.GetIsConnected() || !sessin.GetIsReadable()) { continue; } _dic_sessions_idel.Remove(key); _dic_sessions_dealing.Add(key, sessin); session_to_deal.Add(sessin); } } } #endregion #region 处理可读的 if (session_to_deal.Count > 0) { foreach (var session in session_to_deal) { //接收完整一帧 Frame frame = session.Recv(); if (frame == null) { session.SetOffline(); } else { //根据T找到帧处理器 Command.ICommand cmd = null; if (!_dic_commands.ContainsKey(frame.GetFrameType())) { #region 未找到帧处理器,则调用Session的OnSessionUnkownT try { session.OnSessionUnkownT(frame); } catch (System.Exception ex) { session.SetOffline(); Console.WriteLine("Session.OnSessionUnkownT抛出异常," + ex.Message); } #endregion } else { cmd = _dic_commands[frame.GetFrameType()]; #region //使用帧处理器处理帧 try { cmd.Execute(session, frame); } catch (System.Exception ex) //帧处理器处理,发生异常则调用Session的OnSessionExcept { try { session.OnSessionExcept(frame, ex); } catch (System.Exception ex2) { session.SetOffline(); Console.WriteLine("Session.OnSessionExcept抛出异常," + ex2.Message); } } #endregion } #region 帧处理完后,释放帧所占用的流资源 if (frame.IsBodyHasDataInStream()) { try { var br = frame.GetBodyStream(); br.Close(); br.Dispose(); br = null; } catch (System.Exception ex) { Console.WriteLine("释放帧的流帧体发生异常," + ex.Message); } } #endregion frame = null; } } //将Session归还到数组 lock (_dic_sessions_lock) { foreach (var session in session_to_deal) { _dic_sessions_dealing.Remove(session.GetUUID()); _dic_sessions_idel.Add(session.GetUUID(), session); } session_to_deal.Clear(); } } #endregion #region 检查是否有要主动推送的要处理 Dictionary <string, List <dynamic> > dic_push = new Dictionary <string, List <dynamic> >(); Dictionary <string, TSession> dic_session = new Dictionary <string, TSession>(); lock (_dic_sessions_lock) { if (_dic_wait_to_push.Count > 0) { var keys = _dic_wait_to_push.Keys.ToArray(); foreach (var key in keys) { string session_uuid = key; if (_dic_sessions_idel.ContainsKey(session_uuid)) { _dic_sessions_dealing.Add(session_uuid, _dic_sessions_idel[session_uuid]); dic_push.Add(session_uuid, _dic_wait_to_push[session_uuid]); dic_session.Add(session_uuid, _dic_sessions_idel[session_uuid]); _dic_sessions_idel.Remove(session_uuid); _dic_wait_to_push.Remove(session_uuid); } } } } #endregion #region 处理主动推送 if (dic_push.Count > 0) { foreach (var push_session in dic_push) { string session_uuid = push_session.Key; TSession session = dic_session[session_uuid]; List <dynamic> lst = push_session.Value; foreach (var push in lst) { Frame frame = push.Frame; Action <string, Frame, bool> on_push_result = push.OnPushResult; on_push_result(session_uuid, frame, session.Send(frame)); } } //将Session归还到数组 lock (_dic_sessions_lock) { foreach (var dic in dic_session) { string session_uuid = dic.Key; _dic_sessions_dealing.Remove(session_uuid); _dic_sessions_idel.Add(session_uuid, dic.Value); } dic_session.Clear(); dic_push.Clear(); } } #endregion #region 检查并设置超时未发送或接收数据的Session lock (_dic_sessions_lock) { if (_dic_sessions_idel.Count > 0) { foreach (var dic in _dic_sessions_idel) { TSession sessioin = dic.Value; DateTime accept_time = sessioin.GetAcceptTime(); DateTime?last_communication_time = sessioin.GetLastCommunicationTime(); DateTime now = DateTime.Now; TimeSpan ts; if (last_communication_time == null) { ts = now - accept_time; } else { ts = last_communication_time.Value - accept_time; } if (ts.TotalSeconds > _config.MaxKeepLiveSecond) { sessioin.SetOffline(); } } } } #endregion #region 检查是否有连接断开的session要处理 List <TSession> lst_offline = new List <TSession>(); lock (_dic_sessions_lock) { if (_dic_sessions_idel.Count > 0) { string[] keys = _dic_sessions_idel.Keys.ToArray(); foreach (var key in keys) { TSession sessin = _dic_sessions_idel[key]; if (sessin.GetIsConnected()) { continue; } _dic_sessions_idel.Remove(key); lst_offline.Add(sessin); } } } #endregion #region 处理断开的Session if (lst_offline.Count > 0) { foreach (var session in lst_offline) { session.OnSessionStop(); } lst_offline.Clear(); } #endregion Thread.Sleep(15); } }