System.Threading.Task无法在生产环境中启动

时间:2016-06-06 10:11:04

标签: c# multithreading

我有一个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函数中。

1 个答案:

答案 0 :(得分:0)

我建议您像在此MSDN示例中那样重构代码。在您的代码中困扰我的是,您永远不会等待任务完成任何地方。

  

以下示例启动10个任务,每个任务都将索引作为状态对象传递。索引为2到5的任务抛出异常。对WaitAll方法的调用包装了AggregateException对象中的所有异常并将其传播到调用线程。

Source : Task.WaitAll Method (Task[])

示例中的这一行可能非常重要:

Task.WaitAll(tasks.ToArray());