private void Do() { try { #region 打开数据库连接 Connect(); if (dbConnection.State != ConnectionState.Open) { WriteLogInThread( string.Format( "无法连接[{0}]数据库!", SysParams.Instance.DBParams.DBAddress)); isThreadStarted = false; return; } #endregion #region 建立 ITC MS2000 广播服务器连接 //vaStatus = // IPCast.Connect( // SysParams.Instance.VAParams.Address, // SysParams.Instance.VAParams.UserID, // SysParams.Instance.VAParams.UserPWD); #endregion while (true) { if (!isThreadStarted) { break; } DeleteExpireMP3Files(); try { #region 获取需要广播的消息 string rightNow = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"); string sqlCmd = string.Format( "SELECT TOP 5 * FROM IRAPDWforMES..utb_Log_CRPlaying " + "WHERE Conclusion=0 AND StationID='{0}' " + //"AND ScheduledPlayTime <= '{1}' " + // "AND ScheduledExpireTime >= '{1}' " + 暂时忽略过期广播消息的设置 "ORDER BY CreatedTime ASC", SysParams.Instance.StationID, rightNow); DataSet ds = ExecuteReturnDataSet( CommandType.Text, sqlCmd); DataTable dt = ds.Tables[0]; #endregion foreach (DataRow dr in dt.Rows) { if (!isThreadStarted) { break; } int logID = (int)dr["LogID"]; DateTime timeScheduledPlaying = Convert.ToDateTime(dr["ScheduledPlayTime"].ToString()); DateTime timeScheduledExpire = Convert.ToDateTime(dr["ScheduledExpireTime"].ToString()); string cmdPlay = dr["PlayCommand"].ToString(); int valueCHControl = Convert.ToInt32(dr["CHCtrlValue"].ToString()); int numOfPlaying = Convert.ToInt32(dr["TimesPlayed"].ToString()); if (numOfPlaying <= 0) { numOfPlaying = 1; } WriteLogInThread(cmdPlay); #region 生成目标终端集 int[] terms = GenerateTermIDs(valueCHControl); #endregion if (terms.Length == 0) { #region 没有设置广播播放的通道,忽略该条消息,将数据库中消息记录状态更新为已广播 SqlCommand cmd = new SqlCommand( string.Format( "UPDATE IRAPDWforMES..utb_Log_CRPlaying " + "SET Conclusion=1 WHERE LogID={0}", logID), dbConnection) { CommandType = CommandType.Text, }; try { cmd.ExecuteNonQuery(); } catch (Exception error) { WriteLogInThread(error.Message); } #endregion } else { #region 生成待广播的声音文件集(mp3格式) IPCast.PlayFile[] files; int fileCount = GenerateVoices(cmdPlay, out files); #endregion #region 发送消息广播 if (!IPCast.IPCAST_ServerStatus()) { ConnectToITCSM2000Serv(); } if (!IPCast.IPCAST_ServerStatus()) { WriteLogInThread( string.Format( "无法连接广播服务器[{0}],不能播放广播", SysParams.Instance.VAParams.Address)); continue; } if (TermsIdle(terms)) { try { IPCast.FilePlayStart( ref files, fileCount, terms, terms.Length, 500, 3, 0, 0); } catch (Exception error) { WriteLogInThread( string.Format( "播放消息广播时发生错误:[{0}]。\r\n" + "可能没有找到需要播放的 MP3 文件。", error.Message)); } #endregion #region 将数据库中消息记录状态更新为已广播 SqlCommand cmd = new SqlCommand( string.Format( "UPDATE IRAPDWforMES..utb_Log_CRPlaying " + "SET Conclusion=1 WHERE LogID={0}", logID), dbConnection) { CommandType = CommandType.Text, }; try { cmd.ExecuteNonQuery(); } catch (Exception error) { WriteLogInThread(error.Message); } #endregion } } Thread.Sleep(10); } } catch (Exception error) { WriteLogInThread(error.Message); } Thread.Sleep(SysParams.Instance.RefreshTimeSpan); } } finally { #region 关闭 ITC MS2000 广播服务器连接 IPCast.DisConnect(); #endregion if (dbConnection.State != ConnectionState.Closed) { Disconnect(); } WriteLogInThread("停止监控......"); } }