【问题标题】:Multithread in Windows ServiceWindows 服务中的多线程
【发布时间】:2014-09-02 13:03:36
【问题描述】:

我有一个 Windows 服务执行两个函数(函数 1 和函数 2),但是函数 2 需要 5 分钟才能执行(审核数据库中的用户)。

当我启动服务时,会显示一条超时消息:'ERROR: 1053'。因为function2运行缓慢,但是如果我注释function2,服务运行正常。

我认为 MultiThread 是一种解决方案,但我从来没有使用过这个,如何在这个服务中实现 MultiThread?

我的启动功能:

protected override void OnStart(string[] args)
    {
        // TODO: Add code here to start your service.
        Function1();
        Function2();

        aTimer.Enabled = true;
        eventLog1.WriteEntry("Starting");
    }

【问题讨论】:

  • 这个问题似乎与服务无关。您只是在询问如何创建线程。这是一项相当简单的任务,已经在大约无数个地方广泛涵盖。请使用网络搜索。
  • 两个函数都在访问数据库吗?
  • @DavidHeffernan 实际上,如果不是服务,他不会有问题。这是一个问题,因为他试图在 OnStart() 中的服务的主线程上完成所有工作。如果他在控制台应用程序的 main() 中执行此操作,则不需要线程。

标签: c# windows multithreading service windows-services


【解决方案1】:

您可以使用任务。那会更容易。

如果Function2() 依赖于Function1(),那么你可以这样做:

Task.Run(() =>
{
    Function1();
    Function2();

    aTimer.Enabled = true;
}
eventLog1.WriteEntry("Starting");

我不确定您是希望在 Task.Run 内部还是外部调用 aTimer.Enabled。这取决于您使用它的目的。

如果Function1()和Function2()是独立的,你可以同时执行它们:

Task.Run(()=>
{
    Parallel.Invoke(()=>
    {
       Function1();
    },
    ()=>
    {
       Function2();
    }
}

这将同时执行Function1() 和Function2()。

【讨论】:

  • 不一定,docs of Parallel.Invoke say:不保证操作执行的顺序或它们是否并行执行。
  • 在 Windows 中,(显然是海报的环境)它通常会并发执行,假设 CPU 可用。当然,它还假设有足够的工作,一个功能在另一个功能开始之前无法完成。当然,在某些极端情况下它们不会同时执行,但在问题的上下文中,它并不是非常相关。
【解决方案2】:
Thread temp_thread = new Thread(function);
temp_thread.Start();

【讨论】:

    【解决方案3】:

    您可以尝试以下方法:

    Thread thread1 = new Thread(new ThreadStart(Funtion1));
    Thread thread2 = new Thread(new ThreadStart(Function2));
    thread1.Start();
    thread2.Start();
    

    我希望这能完成你的工作。

    【讨论】:

    • 你不想在 OnStart 方法中join,服务会因为从方法返回的时间太长而被杀死。
    • 正如 Scott 所说,在这种情况下,对 .Join 的调用首先会完全取消线程的使用。
    • 是的,经过编辑的版本正是他所需要的。不会使用加入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2013-07-20
    相关资源
    最近更新 更多