Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中终止从线程(由threadpool创建)启动的进程?_C#_Multithreading - Fatal编程技术网

如何在C#中终止从线程(由threadpool创建)启动的进程?

如何在C#中终止从线程(由threadpool创建)启动的进程?,c#,multithreading,C#,Multithreading,我编写了一个windows服务,它监视数据库表中挂起的作业,并生成线程来运行这些作业,每个线程依次启动一个进程来执行实际工作(该进程是一个Microsoft实用程序,不是自定义的)。这很好,但如果其中一项工作比平时花费的时间更长,我想终止这项工作 如何做到这一点?我需要中止线程还是终止线程启动的进程?我还需要将该进程的标准输出保存在文本文件中。我使用以下代码来实现这一点 using (Process process = Process.Start(startInfo)) { LogToT

我编写了一个windows服务,它监视数据库表中挂起的作业,并生成线程来运行这些作业,每个线程依次启动一个进程来执行实际工作(该进程是一个Microsoft实用程序,不是自定义的)。这很好,但如果其中一项工作比平时花费的时间更长,我想终止这项工作

如何做到这一点?我需要中止线程还是终止线程启动的进程?我还需要将该进程的标准输出保存在文本文件中。我使用以下代码来实现这一点

using (Process process = Process.Start(startInfo))
{
    LogToTextFile(process.StandardOutput.ReadToEnd());
    process.WaitForExit();
    exitCode = process.ExitCode;
}
线程是否可以检查同一个表中的标志并终止正在运行的进程,这样就不需要中止该进程?我使用
ThreadPool.QueueUserWorkItem
创建线程。在不停止windows服务的情况下,停止这些正在运行的进程最可靠的方法是什么?

就是您想要的。终止线程是不明智的,不会对它启动的进程产生任何影响

假设您希望等待60秒以完成该过程,您可以使用以下方法:

using (Process process = Process.Start(startInfo))
{
    LogToTextFile(process.StandardOutput.ReadToEnd());

    if(process.WaitForExit(60000))
    {
        exitCode = process.ExitCode;
    }
    else
    {
        process.Kill();
    }
}
更清楚的是,不要杀死线程池线程

是您要寻找的。终止线程是不明智的,不会对它启动的进程产生任何影响

假设您希望等待60秒以完成该过程,您可以使用以下方法:

using (Process process = Process.Start(startInfo))
{
    LogToTextFile(process.StandardOutput.ReadToEnd());

    if(process.WaitForExit(60000))
    {
        exitCode = process.ExitCode;
    }
    else
    {
        process.Kill();
    }
}

更清楚的是,不要终止线程池线程

感谢您的回复,但是否终止进程的决定由用户决定并存储在表中的标志中,这不是特定的时间限制。我还注意到,当我调用process.StandardOutput.ReadToEnd()时,该行本身会等待进程完成,并且控件不会传递到下一行。因此,我不确定上述代码是否有效。我将尝试这样做。我正在将每个作业的进程Id存储在作业表中,然后在用户从前台线程请求时终止它。成功了。感谢您的回复,但是是否终止进程的决定是由用户做出的,并存储在表中的标志中,这不是一个特定的时间限制。我还注意到,当我调用process.StandardOutput.ReadToEnd()时,该行本身会等待进程完成,并且控件不会传递到下一行。因此,我不确定上述代码是否有效。我将尝试这样做。我正在将每个作业的进程Id存储在作业表中,然后在用户从前台线程请求时终止它。成功了。谢谢