我有一个c#windows服务,它正在执行各种任务。它完全在我的本地系统上工作,但是一旦我在我的产品服务器上启动它,它就不会在它上面执行特定的任务。
这就是我的服务结构:
public static void Execute()
{
try
{
// .... some work ....
foreach (DataRow dr in dt.Rows)
{
string cc = dr["ccode"].ToString();
Task objTask = new Task(delegate { RequestForEachCustomer(cc); });
objTask.Start();
}
}
catch (Exception ex)
{
// Logging in DB + Text File
}
}
public static void RequestForEachCustomer(object cc)
{
try
{
// .... some work ....
foreach (DataRow dr in dt.Rows)
{
WriteLog("RequestForEachCustomer - Before Task");
Task objTask = new Task(delegate { RequestProcessing(dr); });
objTask.Start();
WriteLog("RequestForEachCustomer - After Task");
}
}
catch (Exception ex)
{
// Logging in DB + Text File
}
}
public static void RequestProcessing(object dr)
{
try
{
WriteLog("Inside RequestProcessing");
// .... some work ....
}
catch (Exception ex)
{
// Logging in DB + Text File
}
}
现在生产服务器上发生的事情是它记录了RequestForEachCustomer
中的最后一个条目,即" RequestForEachCustomer - After Task" 但它没有记录RequestProcessing
中的条目,这意味着任务根本没有开始。数据库或文本文件中都没有例外。
窗口的事件查看器中也没有记录任何事件。此外,该服务仍然有效(如果我在数据库中插入另一条记录,它会立即由服务处理,因此服务也不会被卡住。它似乎不会处理RequestProcessing
任务。)< / p>
我对此感到困惑,如果有人能够指出我所犯的错误,那就太好了。哦,顺便说一下,我忘了提到这项服务几天前在服务器上运行良好,它在我的本地PC上仍能正常工作。
编辑:
WriteLog:
public static void WriteErrorLog(string Message)
{
StreamWriter sw = null;
try
{
lock (locker)
{
sw = new StreamWriter(AppDomain.CurrentDomain.BaseDirectory + "\\Logs\\LogFile.txt", true);
sw.WriteLine(DateTime.Now.ToString() + ": " + Message);
sw.Flush();
sw.Close();
}
}
catch (Exception excep)
{
try
{
// .... Inserting ErrorLog in DB ....
}
catch
{
throw excep;
}
throw excep;
}
}
我还在OnStop()
上记录了类似&#34; Service Stopped&#34;每次我停止服务时都会记录日志,因此问题不会出现在WriteLog
函数中。
答案 0 :(得分:0)
我建议您像在此MSDN示例中那样重构代码。在您的代码中困扰我的是,您永远不会等待任务完成任何地方。
以下示例启动10个任务,每个任务都将索引作为状态对象传递。索引为2到5的任务抛出异常。对WaitAll方法的调用包装了AggregateException对象中的所有异常并将其传播到调用线程。
Source : Task.WaitAll Method (Task[])
示例中的这一行可能非常重要:
Task.WaitAll(tasks.ToArray());