public override eRedisAccessError DoCommand(RedisClient redisCli) { #if RedisCommandSpendTime m_sw.Stop(); m_spendMillisecArr[0] = m_sw.ElapsedMilliseconds; m_sw.Restart(); #endif try { if (m_script.m_SHA == null || redisCli.HasLuaScript(m_script.m_SHA) == false) { m_script.m_SHA = redisCli.LoadLuaScript(m_script.m_Body); } byte[][] luaArgvByteArr = new byte[m_luaArgv.Length][]; for (int i = 0; i < m_luaArgv.Length; ++i) { luaArgvByteArr[i] = m_luaArgv[i].ToUtf8Bytes(); } m_theReturn = redisCli.EvalSha(m_script.m_SHA, 0, luaArgvByteArr); } catch (Exception ex) { m_Err = eRedisAccessError.Command_Exec_Fail; SvLogger.Fatal(ex, "ScriptName={2}\nScriptBody={3} -> {0}\n{1}.", ex.Message, ex.StackTrace, m_script.m_Name, m_script.m_Body); } #if RedisCommandSpendTime m_sw.Stop(); m_spendMillisecArr[1] = m_sw.ElapsedMilliseconds; m_sw.Restart(); #endif return(m_Err); }
public bool Connect() { CloseConnectionService(); try { m_connService = new ConnectService(OnRecvServerData, OnServerConnectionClose, OnOpenNewServerConnection, OnOpenConnectionWithSvrInfoFail); //m_connService.RegisterInternalProtocolDealer(InternalProtocolDealer.Instance.Parse); bool result = m_connService.Connect(m_ip, m_port); if (result == true) { SvLogger.Info("Start Connect : Address={0}, Port={1}", m_ip, m_port); return(true); } else { m_connService.Channel.Close(); m_connService = null; } return(false); } catch (Exception ex) { SvLogger.Fatal(ex, "OpenConnectionFail : IP={0}, Port={1}, ErrMsg={2}.", m_ip, m_port, ex.Message); } return(false); }
public override eRedisAccessError DoCommand(RedisClient redisCli) { #if RedisCommandSpendTime m_sw.Stop(); m_spendMillisecArr[0] = m_sw.ElapsedMilliseconds; m_sw.Restart(); #endif try { m_value = redisCli.GetValueFromHash(m_hashID, m_key); } catch (Exception ex) { m_Err = eRedisAccessError.Command_Exec_Fail; SvLogger.Fatal(ex, "{0}\n{1}.", ex.Message, ex.StackTrace); } #if RedisCommandSpendTime m_sw.Stop(); m_spendMillisecArr[1] = m_sw.ElapsedMilliseconds; m_sw.Restart(); #endif return(m_Err); }
// public RedisHashSetKeyValue(string hashID, string key, ByteArray value, RedisCommandCallBackNullFunc commandCallBack, params object[] argv) // : base(commandCallBack != null) // { // m_hashID = hashID; // m_key = key; // m_isStrValue = false; // m_valueBtyeArr = value; // m_commandCallBack = commandCallBack; // m_commandCallBackArgv = argv; //#if RedisCommandSpendTime // m_sw.Start(); //#endif // } public override eRedisAccessError DoCommand(RedisClient redisCli) { #if RedisCommandSpendTime m_sw.Stop(); m_spendMillisecArr[0] = m_sw.ElapsedMilliseconds; m_sw.Restart(); #endif try { if (m_isStrValue == true) { redisCli.SetEntryInHash(m_hashID, m_key, m_valueStr); } //else //{ // byte[] datas = RedisCommonFunc.ObjByteArrayToRedisObjBytes(m_valueBtyeArr); // reGameDataAllocAccountCountdisCli.HSet(m_hashID, m_key.ToUtf8Bytes(), datas); //} } catch (Exception ex) { m_Err = eRedisAccessError.Command_Exec_Fail; SvLogger.Fatal(ex, "{0}\n{1}.", ex.Message, ex.StackTrace); } #if RedisCommandSpendTime m_sw.Stop(); m_spendMillisecArr[1] = m_sw.ElapsedMilliseconds; m_sw.Restart(); #endif return(m_Err); }
public override eRedisAccessError DoCommand(RedisClient redisCli) { #if RedisCommandSpendTime m_sw.Stop(); m_spendMillisecArr[0] = m_sw.ElapsedMilliseconds; m_sw.Restart(); #endif try { if (m_script.m_SHA == null || redisCli.HasLuaScript(m_script.m_SHA) == false) { m_script.m_SHA = redisCli.LoadLuaScript(m_script.m_Body); } m_theReturn = redisCli.ExecLuaShaAsList(m_script.m_SHA, m_luaArgv); } catch (Exception ex) { m_Err = eRedisAccessError.Command_Exec_Fail; SvLogger.Fatal(ex, "ScriptName={2}\nScriptBody={3} -> {0}\n{1}.", ex.Message, ex.StackTrace, m_script.m_Name, m_script.m_Body); } #if RedisCommandSpendTime m_sw.Stop(); m_spendMillisecArr[1] = m_sw.ElapsedMilliseconds; m_sw.Restart(); #endif return(m_Err); }
public override eRedisAccessError DoCommand(RedisClient redisCli) { #if RedisCommandSpendTime m_sw.Stop(); m_spendMillisecArr[0] = m_sw.ElapsedMilliseconds; m_sw.Restart(); #endif try { redisCli.AddItemToSortedSet(m_key, m_item, m_score); } catch (Exception ex) { m_Err = eRedisAccessError.Command_Exec_Fail; SvLogger.Fatal(ex, "{0}\n{1}.", ex.Message, ex.StackTrace); } #if RedisCommandSpendTime m_sw.Stop(); m_spendMillisecArr[1] = m_sw.ElapsedMilliseconds; m_sw.Restart(); #endif return(m_Err); }
public override eRedisAccessError DoCommand(RedisClient redisCli) { #if RedisCommandSpendTime m_sw.Stop(); m_spendMillisecArr[0] = m_sw.ElapsedMilliseconds; m_sw.Restart(); #endif try { HashSet <string> items = redisCli.GetAllItemsFromSet(m_key); if (items != null) { m_returns = new List <string>(); m_returns.AddRange(items); } } catch (Exception ex) { m_Err = eRedisAccessError.Command_Exec_Fail; SvLogger.Fatal(ex, "{0}\n{1}.", ex.Message, ex.StackTrace); } #if RedisCommandSpendTime m_sw.Stop(); m_spendMillisecArr[1] = m_sw.ElapsedMilliseconds; m_sw.Restart(); #endif return(m_Err); }
private void run() { while (m_runThread) { if (m_redisCliDisconnect == false) { try { byte[][] datas = m_redisAccess.RedisCli.BRPop(m_channelNameArr, 1); if (datas.Length > 1) { RedisProtocolData protocolData = new RedisProtocolData(ref datas[1]); lock (m_protocolDatasLockObj) m_selfThreadProtocolDataList.Add(protocolData); } } catch (Exception ex) { if (m_redisAccess.RedisCli.IsSocketConnected() == false) { m_redisCliDisconnect = true; } SvLogger.Fatal(ex, "{0}\n{1}.", ex.Message, ex.StackTrace); } } else { try { if (m_redisAccess.Reconnect()) { m_redisCliDisconnect = false; } else { Thread.Sleep(1000); } } catch (Exception ex) { Thread.Sleep(1000); } } } }
/// <summary> /// 初始化DB连接 /// </summary> /// <param name="dbConnFlag"></param> /// <param name="ip"></param> /// <param name="port"></param> /// <param name="name"></param> /// <param name="user"></param> /// <param name="passwrod"></param> /// <returns></returns> public bool InitDBConnection(eDbConnFlag dbConnFlag, string ip, int port, string name, string user, string passwrod) { //配置载入 try { int errCode = DbAccess.Instance.InitilizeDbConn(dbConnFlag, "mysql", ip, port.ToString(), name, user, passwrod, 0); if (errCode != 0) { return(false); } } catch (Exception ex) { SvLogger.Fatal(ex, "Connect MySql DataBase Fail: ErrMsg={0}, Stack={1}.", ex.Message, ex.StackTrace); return(false); } return(true); }
// public RedisHashMSetKeyValue(string hashID, Dictionary<string, ByteArray> dataDic, RedisCommandCallBackNullFunc commandCallBack, params object[] argv) // : base(commandCallBack != null) // { // m_hashID = hashID; // m_dataByteArrDic = dataDic; // m_isStrValue = false; // m_commandCallBack = commandCallBack; // m_commandCallBackArgv = argv; //#if RedisCommandSpendTime // m_sw.Start(); //#endif // } public override eRedisAccessError DoCommand(RedisClient redisCli) { #if RedisCommandSpendTime m_sw.Stop(); m_spendMillisecArr[0] = m_sw.ElapsedMilliseconds; m_sw.Restart(); #endif try { if (m_isStrValue == true) { redisCli.SetRangeInHash(m_hashID, m_dataStrDic); } //else //{ // byte[][] m_keysArr = new byte[m_dataByteArrDic.Count][]; // byte[][] m_valuesArr = new byte[m_dataByteArrDic.Count][]; // int index = 0; // foreach(KeyValuePair<string, ByteArray> dataByteArrEle in m_dataByteArrDic) // { // m_keysArr[index] = dataByteArrEle.Key.ToUtf8Bytes(); // m_valuesArr[index] = RedisCommonFunc.ObjByteArrayToRedisObjBytes(dataByteArrEle.Value); // ++index; // } // redisCli.HMSet(m_hashID, m_keysArr, m_valuesArr); //} } catch (Exception ex) { m_Err = eRedisAccessError.Command_Exec_Fail; SvLogger.Fatal(ex, "{0}\n{1}.", ex.Message, ex.StackTrace); } #if RedisCommandSpendTime m_sw.Stop(); m_spendMillisecArr[1] = m_sw.ElapsedMilliseconds; m_sw.Restart(); #endif return(m_Err); }
/// <summary> /// 服务逻辑更新 /// </summary> public void Update() { try { #region 协议处理 ClientProtocolDealManager.Instance.TransferRecvClientData(ref m_protocolList); if (m_protocolList.Count > 0) { for (int i = 0; i < m_protocolList.Count; i++) { try { //ServerProtocolDealManager.Instance.ServerSend2ClientData(clientSessionID, protocolData); } catch (Exception ex) { SvLogger.Fatal(ex, string.Format("Param Proto Exception : {0}\r\nStackTrace : \r\n{1}", ex.Message, ex.StackTrace)); } } m_protocolList.Clear(); } #endregion #region 数据库回调处理 List <DbAccessPoolVistor> dapvistorlist = DbAccessPool.GetVistorList(); for (int i = 0; i < dapvistorlist.Count; i++) { DbAccessPoolVistor dapvistor = dapvistorlist[i]; int callbackNum = dapvistor.GetCallbackNum(); int doBackNum = 0; int vStartTick = Environment.TickCount; int doStartTick; DateTime doStartTime; while (doBackNum < callbackNum) { doStartTick = Environment.TickCount; doStartTime = HTBaseFunc.GetTime(0); DbAccessItem dbi = dapvistor.PopupCallback(); if (dbi != null) { dbi.OnFinish(dbi); } ++doBackNum; int doEndTick = Environment.TickCount; int doSpendTicks = (doEndTick >= doStartTick ? doEndTick - doStartTick : (int.MaxValue + doEndTick) + (int.MaxValue - doStartTick)); if (doSpendTicks >= 1000) { SvLogger.Warn("Update TimeOut : DbAccessPoolCallback {0}, SpendMs = {1}, SpName = {2}, StartTime = {3}.", dapvistor.Flag, doSpendTicks, ((dbi != null) ? dbi.SpName : ""), doStartTime.ToString("yyyy-MM-dd HH:mm:ss.fff")); } int vSpendTicks = (doEndTick >= vStartTick ? doEndTick - vStartTick : doEndTick + (int.MaxValue - vStartTick)); if (vSpendTicks >= SvrCommCfg.Instance.DbAccessPoolCallbackDealInterval) { break; } } } #endregion #region 定时打印服务器监控信息 m_svrCheckEndTicket = Environment.TickCount; m_svrCheckSpendTicket = (m_svrCheckEndTicket >= m_svrCheckStartTicket ? m_svrCheckEndTicket - m_svrCheckStartTicket : (int.MaxValue + m_svrCheckEndTicket) + (int.MaxValue - m_svrCheckStartTicket)); if (m_svrCheckSpendTicket >= 60000) { m_svrCheckStartTicket = m_svrCheckEndTicket; ServerCommon.DbAccess.Instance.ShowDBAccCountInPool(); } #endregion #region 内存回收 if (m_lastMemoryCheck.AddSeconds(30) < HTBaseFunc.GetTime(0)) { if (m_lastGcTime.AddSeconds(30) < HTBaseFunc.GetTime(0) && System.Diagnostics.Process.GetCurrentProcess().WorkingSet64 > 128 * 1024 * 1024) { GC.Collect(); m_lastGcTime = HTBaseFunc.GetTime(0); } m_lastMemoryCheck = HTBaseFunc.GetTime(0); } #endregion } catch (Exception ex) { SvLogger.Fatal(ex, string.Format("Main Logic Exception : {0}\r\nStackTrace : \r\n{1}", ex.Message, ex.StackTrace)); } }
/// <summary> /// 初始化服务实例 /// </summary> /// <returns></returns> public override bool Init(string[] args) { if (base.Init(args) == false) { return(false); } #region 初始化服务配置 //初始化LOG日志配置 SvLogger.Init(XmlConfigure.Instance.GetAppConfigString("LogFile"), XmlConfigure.Instance.GetAppConfigString("LogFileLevel"), XmlConfigure.Instance.GetAppConfigString("LogConsoleLevel")); ServerConfigData.ListenPort = XmlConfigure.Instance.GetAppConfigInt("ListenPort"); ServerConfigData.DBIP = XmlConfigure.Instance.GetAppConfigString("DBIP"); ServerConfigData.DBPort = XmlConfigure.Instance.GetAppConfigInt("DBPort"); ServerConfigData.DBName = XmlConfigure.Instance.GetAppConfigString("DBName"); ServerConfigData.DBUser = XmlConfigure.Instance.GetAppConfigString("DBUser"); ServerConfigData.DBPassword = XmlConfigure.Instance.GetAppConfigString("DBPassword"); ServerConfigData.OSSPath = XmlConfigure.Instance.GetAppConfigString("OSSPath"); ServerConfigData.OSSUser = XmlConfigure.Instance.GetAppConfigString("OSSUser"); ServerConfigData.OSSPassword = XmlConfigure.Instance.GetAppConfigString("OSSPassword"); #endregion #region 网络组更新启动 try { SvLogger.Info("<< Start Network Listen : OutSidePort={0}.", ServerConfigData.ListenPort); ServerCommon.Network.XDNetworkManager.Instance.InitConfig(ServerConfigData.ListenPort); ServerCommon.Network.XDNetworkManager.Instance.StartRun(); } catch (Exception ex) { SvLogger.Fatal(ex, ">> ****** Network Listen Fail! Msg={0}", ex.Message); return(false); } SvLogger.Info(">> Network Listen Succ !!!"); #endregion #region 数据库连接 bool dbConnectBack = false; dbConnectBack = DBAccessCfg.Instance.InitDBConnection(eDbConnFlag.Game, ServerConfigData.DBIP, ServerConfigData.DBPort, ServerConfigData.DBName, ServerConfigData.DBUser, ServerConfigData.DBPassword); if (dbConnectBack == false) { SvLogger.Error("DB Access Config Deal Error!"); return(false); } #endregion #region 从数据库加载服务器组配置数据 //LoadDataFromMySqlManager.Instance.m_OnLoadAllTableSucc = onLoadConfigFromDBFinish; //LoadDataFromMySqlManager.Instance.LoadData(); #endregion return(true); }
private eRedisAccessError commandDeal() { if (m_redisCliDisconnect == true) { return(eRedisAccessError.Connection_Is_Disconnect); } eRedisAccessError errID = eRedisAccessError.None; lock (m_mainThreadCommandListLuckObj) { if (m_mainThreadCommandList.Count > 0) { m_selfThreadCommandList.AddRange(m_mainThreadCommandList); m_mainThreadCommandList.Clear(); } } if (m_selfThreadCommandList.Count > 0) { int i = 0; for (; i < m_selfThreadCommandList.Count; ++i) { try { errID = m_selfThreadCommandList[i].DoCommand(m_redisAccess.RedisCli); if (errID != 0) { if (m_redisAccess.RedisCli.Ping() == false) { m_redisCliDisconnect = true; if (i > 0) { m_selfThreadCommandList.RemoveRange(0, i); i = 0; } break; } } if (m_selfThreadCommandList[i].NeedDealCallBack == true) { m_selfThreadDealedCommandList.Add(m_selfThreadCommandList[i]); } } catch (Exception ex) { errID = eRedisAccessError.Command_Exec_Exception; SvLogger.Fatal(ex, "Redis Command Deal Exception: {0}\r\nStackTrace : \r\n{1}", ex.Message, ex.StackTrace); } } if (i == m_selfThreadCommandList.Count) { m_selfThreadCommandList.Clear(); } } if (m_selfThreadDealedCommandList.Count > 0) { lock (m_mainThreadDealdCommandListLuckObj) { m_mainThreadDealedCommandList.AddRange(m_selfThreadDealedCommandList); } m_selfThreadDealedCommandList.Clear(); } return(errID); }
private void run() { while (m_runThread) { m_stopwatch.Restart(); if (m_redisCliDisconnect == false) { try { if (commandDeal() > 0) { try { if (m_redisAccess.Reconnect() == true) { m_redisCliDisconnect = false; } } catch (Exception ex) { m_redisCliDisconnect = true; SvLogger.Fatal(ex, "{0}\n{1}.", ex.Message, ex.StackTrace); } } } catch (Exception ex) { if (m_redisAccess.RedisCli.IsSocketConnected() == false) { m_redisCliDisconnect = true; } SvLogger.Fatal(ex, "{0}\n{1}.", ex.Message, ex.StackTrace); } } else { try { if (m_redisAccess.Reconnect()) { m_redisCliDisconnect = false; } else { Thread.Sleep(1000); } } catch (Exception ex) { Thread.Sleep(1000); } } m_stopwatch.Stop(); if (m_stopwatch.Elapsed < m_maxSleepTS) { Thread.Sleep(m_maxSleepTS - m_stopwatch.Elapsed); } else { Thread.Sleep(1); } } commandDeal(); m_redisAccess.Close(); }
/// <summary> /// 初始化数据库连接 /// </summary> /// <param name="dbConnFlag">连接名</param> /// <param name="serverType">数据库类型</param> /// <param name="serverIp">数据库服务器名</param> /// <param name="serverPort">数据库端口</param> /// <param name="databaseName">数据库名</param> /// <param name="userName">数据库用户名</param> /// <param name="userPass">数据库用户密码</param> /// <param name="childConnCount">子连接个数</param> /// <returns>返回错误信息</returns> public int InitilizeDbConn(eDbConnFlag dbConnFlag, string serverType, string serverIp, string serverPort, string databaseName, string userName, string userPass, int childConnCount) { int errCode = 0; //最终Connect Flag生成 m_connFlagMakeLines[dbConnFlag] += 1; int lineIndex = Convert.ToInt32(m_connFlagMakeLines[dbConnFlag]); int connFlag = Convert.ToInt32(dbConnFlag) | lineIndex; DbAccessPool dapool = DbAccessPool.GetPool(connFlag); if (dapool != null) { errCode = 1111; SvLogger.Error("Had Same DB Connections : ConnectType={0}, ConnectFlag={1}.", dbConnFlag, connFlag); return(errCode); } //获取SQL日志记录池 DbAccessPool sqlogdapool = null; //if (dbConnFlag != eDbConnFlag.SqlLog) // sqlogdapool = DbAccessPool.GetPool(EnumDbConnName.SqlLog.ToString()); //建立数据库连接 DbAccessPoolVistor vistor = new DbAccessPoolVistor(connFlag); dapool = new DbAccessPool(connFlag, SvLogger.GetLogger(), vistor, sqlogdapool); try { dapool.Start(serverType, serverIp, serverPort, databaseName, userName, userPass); } catch (Exception ex) { SvLogger.Fatal(ex, "{0}\n{1}.", ex.Message, ex.StackTrace); errCode = 1111; return(errCode); } int mainFlag = dapool.Flag; if (dbConnFlag == eDbConnFlag.Game) { m_gameDBMainConnFlagList.Add(dapool.Flag); } else if (dbConnFlag == eDbConnFlag.Log) { m_logDbAccPool = dapool; } else if (dbConnFlag == eDbConnFlag.Secd) { m_secdDbAccPool = dapool; } else if (dbConnFlag == eDbConnFlag.GM) { m_gmDBAccPool = dapool; } else if (dbConnFlag == eDbConnFlag.Platform) { m_platformDBAccPool = dapool; } else if (dbConnFlag == eDbConnFlag.Moniteor) { m_moniteorDBAccPool = dapool; } else if (dbConnFlag == eDbConnFlag.Entry) { m_entryDBAccPool = dapool; } else if (dbConnFlag == eDbConnFlag.GiftCode) { m_giftCodeDBAccPool = dapool; } //加入池 DbAccessPool.AddPool(dapool); //Game数据库子连接建立 if (dbConnFlag == eDbConnFlag.Game) { for (int i = 0; i < childConnCount; ++i) { //最终Connect Flag生成 m_connFlagMakeLines[dbConnFlag] += 1; lineIndex = Convert.ToInt32(m_connFlagMakeLines[dbConnFlag]); connFlag = Convert.ToInt32(dbConnFlag) | lineIndex; dapool = DbAccessPool.GetPool(connFlag); if (dapool != null) { errCode = 1111; SvLogger.Error("Had Same DB Connections : ConnectType={0}, ConnectFlag={1}.", dbConnFlag, connFlag); return(errCode); } //获取SQL日志记录池 sqlogdapool = null; //if (dbConnFlag != eDbConnFlag.SqlLog) // sqlogdapool = DbAccessPool.GetPool(EnumDbConnName.SqlLog.ToString()); //建立数据库连接 vistor = new DbAccessPoolVistor(connFlag); dapool = new DbAccessPool(connFlag, SvLogger.GetLogger(), vistor, sqlogdapool); try { dapool.Start(serverType, serverIp, serverPort, databaseName, userName, userPass); } catch (Exception ex) { SvLogger.Fatal(ex, "{0}\n{1}.", ex.Message, ex.StackTrace); errCode = 1111; return(errCode); } List <int> childList; if (m_gameDBChildConnFlagDic.TryGetValue(mainFlag, out childList) == false) { childList = new List <int>(); m_gameDBChildConnFlagDic.Add(mainFlag, childList); } childList.Add(dapool.Flag); //加入池 DbAccessPool.AddPool(dapool); } } return(errCode); }
/// <summary> /// 初始化连接 /// </summary> /// <returns>是否成功</returns> public bool InitDBConnections() { //配置载入 XmlDocument doc = new XmlDocument(); try { doc.Load(@"Config\DatabaseCfg.xml"); XmlNode root = doc.SelectSingleNode("XmlAppConfig"); if (root == null) { return(false); } else { XmlNodeList dbNodeList = root.SelectNodes("DBItem"); foreach (XmlNode dbNode in dbNodeList) { eDbConnFlag connFlag = eDbConnFlag.None; string dbTypeName = dbNode.Attributes["name"].Value; switch (dbTypeName) { case "GameDB": connFlag = eDbConnFlag.Game; break; case "LogDB": connFlag = eDbConnFlag.Log; break; case "SecdDB": connFlag = eDbConnFlag.Secd; break; case "GMDB": connFlag = eDbConnFlag.GM; break; } if (connFlag != eDbConnFlag.None) { string dbType = "", serverIP = "", serverPort = "", databaseName = "", userName = "", UserPass = "", childConnCount = ""; XmlNodeList cfgNodeList = dbNode.SelectNodes("config"); foreach (XmlNode cfgNode in cfgNodeList) { switch (cfgNode.Attributes["key"].Value) { case "DbType": dbType = cfgNode.Attributes["value"].Value; break; case "ServerIP": serverIP = cfgNode.Attributes["value"].Value; break; case "ServerPort": serverPort = cfgNode.Attributes["value"].Value; break; case "DatabaseName": databaseName = cfgNode.Attributes["value"].Value; break; case "UserName": userName = cfgNode.Attributes["value"].Value; break; case "UserPass": UserPass = cfgNode.Attributes["value"].Value; break; case "ChildConnCount": childConnCount = cfgNode.Attributes["value"].Value; break; } } int errCode = DbAccess.Instance.InitilizeDbConn(connFlag, dbType, serverIP, serverPort, databaseName, userName, UserPass, Convert.ToInt32(childConnCount)); if (errCode != 0) { return(false); } } } } } catch (Exception ex) { SvLogger.Fatal(ex, "Load Fail Fatal: ErrMsg={0}, Stack={1}.", ex.Message, ex.StackTrace); return(false); } return(true); }
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { SvLogger.Fatal((Exception)e.ExceptionObject, "UnhandledException"); }