windows服务的问题。请帮忙

heilong05 2010-06-20 04:47:30
在服务器写了一个服务:
让他一直循环做轮训然后做业务。处理。但是因为业务处理的代码需要的时间比较多。在业务还没所有处理完毕。服务就不管了。然后继续做轮训来监控循环了。请问我如何控制服务。必须让他当前的轮训执行完我这次的业务以后。才能进行下一次的轮训了。
代码如下:
private void StartMonitor()
{
int SleepTime = 3000;//3秒

while (true)
{
try
{
foreach (string FolderPath in FoldersPath)
{

string SqlconnectionString = InitalContextInfo(FolderPath);
DataBaseService.connectionString = SqlconnectionString;
try
{
//判断文件是否上传完毕。如果已经完毕就对上传文件进行数据库的处理。
DataSet e = DataBaseService.Query("select * from FileInfo where IfTransferd=0 and Mergeing=0");
if (e != null)
{
foreach (DataRow dr in e.Tables[0].Rows)
{
string Guid = dr["Id"].ToString();
string Filename = dr["FileName"].ToString();
long FileSize = long.Parse(dr["FileSize"].ToString());
int Totaloffset = int.Parse(dr["Totaloffset"].ToString());
//string Filepath = ServicePath + "\\ServiceStorage\\" + Filename;
string Filepath = FolderPath + "\\ServiceStorage\\" + Filename;
string RequestUser = dr["RuquestUser"].ToString();
if (!System.IO.File.Exists(Filepath)) continue;
System.IO.FileInfo fi = new System.IO.FileInfo(Filepath);
long Filelegtn = fi.Length;
if (Filelegtn >= FileSize) //判断上传完毕
{
int value = DataBaseService.ExecuteSql(" update FileInfo set Mergeing=1,IfTransferd=1 where id='" + Guid + "'");
DoDataBaseBO(RequestUser,Filepath);//执行业务处理
}
}
}
}
catch
{}
}
} catch
{}

Thread.Sleep(SleepTime);
}

}
/// <summary>
/// 解包上传后的文件并将数据集文件更新到数据库中 /// </summary>
/// <param name="FilePath"></param>
public void DoDataBaseBO(string RequestUeser, string FilePath)
{
string fileName = Path.GetFileNameWithoutExtension(FilePath);
DataSet ds = Yqun.Common.Encoder.DataSetCoder.DecryAndDecompreeDataSetFromFile(ToDirectory + "\\" + fileName + ".xml");
if (ds != null && ds.Tables.Count > 0)
{
if (ds.Tables.Contains("sys_auth_FunctionPermission"))
{
DataTable RolesDt = ds.Tables["sys_auth_Roles"];
string[] permissiontable = new string[] { "sys_auth_FunctionPermission", "sys_auth_RecordPermission", "sys_auth_Permissions", "sys_auth_Organization", "sys_auth_Users", "sys_auth_Roles" };
for (int k = 0; k < permissiontable.Length; k++)
{
DataTable dt = ds.Tables[permissiontable[k]];
#region sys_auth_FunctionPermission
if (permissiontable[k] == "sys_auth_FunctionPermission")
{
#region 用户角色的关系循环处理
for (int i = 0; i < RolesDt.Rows.Count; i++)
{
string permission = string.Empty;
string[] permissions = RolesDt.Rows[i]["permissions"].ToString().Split(',');
for (int j = 0; j < permissions.Length; j++)
{
if (j == permissions.Length - 1)
{
permission += "'" + permissions[i] + "'";
}
else
{
permission += "'" + permissions[i] + "',";
}
}
DataRow[] drs = dt.Select("FunctionsID in (" + permission + ")");
DataSet PhySet = DataService.GetDataSet(" select * from sys_auth_FunctionPermission");
DataRow[] drPhyset = PhySet.Tables[0].Select("FunctionsID in (" + permission + ")");
foreach (DataRow dr in drPhyset)
{
string Sql = "Delete from sys_auth_FunctionPermission where id='" + dr["ID"].ToString() + "'";
DataService.ExcuteCommand(Sql);
PhySet.Tables[0].Rows.Remove(dr);
}
foreach (DataRow dr2 in drs)
{
DataRow dr = PhySet.Tables[0].NewRow();
dr.ItemArray = dr2.ItemArray;
PhySet.Tables[0].Rows.Add(dr);
}
object oo = DataService.Update(PhySet);

if (oo.ToString() == "1")
{ PhySet.Dispose();}
}
#endregion
}
#endregion

#region sys_auth_RecordPermission
else if (permissiontable[k] == "sys_auth_RecordPermission")
{
#region 用户角色的关系循环处理
for (int i = 0; i < RolesDt.Rows.Count; i++)
{
string permission = string.Empty;
string[] permissions = RolesDt.Rows[i]["permissions"].ToString().Split(',');
for (int j = 0; j < permissions.Length; j++)
{

if (j == permissions.Length - 1)
{
permission += "'" + permissions[i] + "'";
}
else
{
permission += "'" + permissions[i] + "',";
}
}

DataRow[] drs = dt.Select("RecordsID in (" + permission + ")");
DataSet PhySet = DataService.GetDataSet(" select * from sys_auth_RecordPermission");
DataRow[] drPhyset = PhySet.Tables[0].Select("RecordsID in (" + permission + ")"); foreach (DataRow dr in drPhyset)
{

string Sql = "Delete from sys_auth_RecordPermission where id='"+dr["ID"].ToString()+"'";
DataService.ExcuteCommand(Sql);
PhySet.Tables[0].Rows.Remove(dr);
}
foreach (DataRow dr2 in drs)
{
DataRow dr = PhySet.Tables[0].NewRow();
dr.ItemArray = dr2.ItemArray;
PhySet.Tables[0].Rows.Add(dr);
}
object oo = DataService.Update(PhySet);
if (oo.ToString() == "1")
{
PhySet.Dispose();
}
}
#endregion }
#endregion


}



...全文
70 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjp1234airen4385 2010-06-20
  • 打赏
  • 举报
回复
是不是你的数据库连接超时造成的。
粗略的看了一下你的代码,没用时钟和线程,应该不会出现你说的现象。
heilong05 2010-06-20
  • 打赏
  • 举报
回复
看事件查看器里的系统日志里有这些记录为;等待来自 YqunTransferServerService 服务的事务处理响应超时(30000 毫秒)。"YqunTransferServerService "为服务名。请问这是什么原因了?
heilong05 2010-06-20
  • 打赏
  • 举报
回复
请帮忙啊
heilong05 2010-06-20
  • 打赏
  • 举报
回复
请帮忙来解决如何控制服务的循环时间。
必须得等业务的数据完成以后才能进行再次循环吗?
谢谢。

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧