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

标签 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 任务。)

我对此感到困惑,如果有人能指出我所犯的错误,那就太好了。哦,顺便说一句,我忘了提一下,这项服务几天前在服务器上运行良好,而且在我的本地 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() 上记录了一个类似“Service Stopped”的条目和它的日志,所以问题不可能存在于 WriteLog 功能。

最佳答案

我建议您按照这个 MSDN 示例重构您的代码。在您的代码中困扰我的是,您从不等待任务在任何地方完成。

The following example starts 10 tasks, each of which is passed an index as a state object. Tasks with an index from two to five throw exceptions. The call to the WaitAll method wraps all exceptions in an AggregateException object and propagates it to the calling thread.

Source : Task.WaitAll Method (Task[])

示例中的这一行可能有些重要:

Task.WaitAll(tasks.ToArray());

关于c# - System.Threading.Task 未在生产环境中启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37654776/

相关文章:

c# - 如何在 C# 中使用 post 将 json 值传递给 API?

java - 不使用 Java EE 应用程序服务器创建连接池

java - 如何在后台运行进程并重定向jsp页面

c# - 使用 C# 创建线程并为其分配函数

c# - EmguCV 的 solvePnPRansac 期望哪些参数类型(明确的,而不是接口(interface))?

c# - 删除矩形类

c# - 如何在基类中盲目引发事件而不从派生类调用它

java - 线程通过调用interrupt()被中断,但是Thread.isInterrupted()返回false

c# - 我可以在 get 访问器中锁定集合吗?

c# - 在 ASP.NET MVC 中保留用户数据