C# System.Threading.Task未在生产环境中启动

C# System.Threading.Task未在生产环境中启动,c#,multithreading,C#,Multithreading,我有一个c#windows服务,它正在执行各种任务。它在我的本地系统上运行得很好,但只要我在我的产品服务器上启动它,它就不会在上面执行特定的任务 这就是我的服务的结构: public static void Execute() { try { // .... some work .... foreach (DataRow dr in dt.Rows) { str

我有一个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
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)
记录实际异常。