C# System.Threading.Task未在生产环境中启动
我有一个c#windows服务,它正在执行各种任务。它在我的本地系统上运行得很好,但只要我在我的产品服务器上启动它,它就不会在上面执行特定的任务 这就是我的服务的结构:C# System.Threading.Task未在生产环境中启动,c#,multithreading,C#,Multithreading,我有一个c#windows服务,它正在执行各种任务。它在我的本地系统上运行得很好,但只要我在我的产品服务器上启动它,它就不会在上面执行特定的任务 这就是我的服务的结构: public static void Execute() { try { // .... some work .... foreach (DataRow dr in dt.Rows) { str
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
task)
我对此感到困惑,如果有人能指出我所犯的错误,那就太好了。哦,顺便说一句,我忘记了几天前这项服务在服务器上运行得很好,在我的本地PC上仍然运行得很好
编辑:
书面记录:
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()
上记录了一个类似“服务已停止”的条目,每次我停止服务时都会记录它的日志,这样问题就不会出现在WriteLog
函数中。我建议您重构代码,如本MSDN示例所示。在你的代码中让我烦恼的是,你从不等待任务在任何地方完成
下面的示例启动10个任务,每个任务都作为状态对象传递一个索引。索引为2到5的任务抛出异常。对WaitAll方法的调用将所有异常包装在AggregateException对象中,并将其传播到调用线程
示例中的这一行可能有一定的重要性:
Task.WaitAll(tasks.ToArray());
从代码片段中可以看出,dt.Rows是空的,因此没有日志。什么是
WriteLog()
?也许它不是线程安全的。我可以向您保证,dt.Rows不是空的。您可以启动任务,但从不等待它。这意味着在任务中抛出的任何异常都不会被看到,除非您在委托中显式地捕获并记录它们(外部的大量错误处理似乎意味着您没有…)。实际的委托RequestProcessing
是什么样子的?如果在任务中抛出异常,则不会得到异常。使用objTask.ContinueWith(t=>/*log t.Exception*/,TaskContinuationOptions.OnlyOnFaulted)
记录实际异常。