任务工厂对象终止方法c#

任务工厂对象终止方法c#,c#,object,task,factory,kill,C#,Object,Task,Factory,Kill,问题:如何在执行bat文件的过程中让进程终止,我可以让它终止,但继续显示方法的结果 我正在将结果打印到控制台,但是,无法在kill之后停止结果和执行路径。我正在运行4个进程 internal class Program { public static string line = string.Empty; private static void Main(string[] args) { LimitedConcurrencyLevelTaskSched

问题:如何在执行bat文件的过程中让进程终止,我可以让它终止,但继续显示方法的结果

我正在将结果打印到控制台,但是,无法在kill之后停止结果和执行路径。我正在运行4个进程

internal class Program
{
    public static string line = string.Empty;

    private static void Main(string[] args)
    {

        LimitedConcurrencyLevelTaskScheduler lcts = new LimitedConcurrencyLevelTaskScheduler(500);
        TaskFactory factory = new TaskFactory(lcts);


        for (var i = 0; i < 4; i++)
        {

            factory.StartNew(() =>
                                 {

                                     var pattern = string.Empty;
                                     ExecuteProcesses(pattern);
                                 }
                );
        }

    Console.ReadKey();
    }




public static void ExecuteProcesses(string pattern)
{

    var startInfo = new ProcessStartInfo();

    startInfo.FileName = @"C:\test.bat"; //pattern to replace string
    startInfo.UseShellExecute = false;
    startInfo.CreateNoWindow = true;
    startInfo.RedirectStandardOutput = true;
    startInfo.WorkingDirectory = @"C:\TEST\";
    startInfo.RedirectStandardError = true;
    //startInfo.UserName = "Administrator";


    using (Process batProcess = Process.Start(startInfo))
    {
        Console.WriteLine(string.Format("{0} | START | {1} | {2} | {3}",DateTime.Now, batProcess.StartTime, batProcess.Id, startInfo.FileName));

        //Console.WriteLine(batProcess.s);
        using (StreamReader reader = batProcess.StandardOutput)
        {

            if (!batProcess.WaitForExit(10000))
            {

                Console.WriteLine("Killing");
                try
                {
                    batProcess.CloseMainWindow();
                    batProcess.Kill();
                    batProcess.WaitForExit();
                    Console.WriteLine("Exited");
                    //Console.WriteLine("-->Killing Process ID {0}, Process exit code: {1},  End Time {2}\t",
                      //                batProcess.Id, batProcess.ExitCode, batProcess.ExitTime);
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                }
            }

            ///Console.WriteLine("--> Process ID {0}, Start Time {1}\t", batProcess.Id, batProcess.StartTime);

                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    //list.Add(line);
                    Console.WriteLine(line);
                }

            //Write to console
            //Console.WriteLine("----------\r\n" + result + "----------\r\n");
            //Write to log
            //Common.WriteToLog(result);


            Console.WriteLine(result);

            Console.WriteLine(string.Format("{0} |  END  | {1} | {2} | {3}",DateTime.Now, batProcess.ExitTime, batProcess.Id, startInfo.FileName));
            //Console.WriteLine("-->Exit Process ID {0}, Process exit code: {1},  End Time {2}, Total Processing time {3}\t", batProcess.Id, batProcess.ExitCode, batProcess.ExitTime, batProcess.TotalProcessorTime);
        }
    }


    //if (!batProcess.WaitForExit(25000))
            //{
            //    Console.WriteLine("--> Process ID {0}, Process exit code: {1},  End Time {2}\t", batProcess.Id, batProcess.ExitCode, batProcess.ExitTime);
            //    Common.WriteToLog(batProcess.ExitCode.ToString());
            //}
            //else
            //{
            //    Console.WriteLine("Killing, Process exit code: {0}", batProcess.ExitCode);
            //    Process.GetCurrentProcess().Kill();

            //}

        }
    }
内部类程序
{
公共静态字符串行=string.Empty;
私有静态void Main(字符串[]args)
{
LimitedConcurrencyLevel TaskScheduler lcts=新的LimitedConcurrencyLevel TaskScheduler(500);
TaskFactory=新TaskFactory(lcts);
对于(变量i=0;i<4;i++)
{
factory.StartNew(()=>
{
var模式=string.Empty;
执行过程(模式);
}
);
}
Console.ReadKey();
}
公共静态void ExecuteProcesses(字符串模式)
{
var startInfo=new ProcessStartInfo();
startInfo.FileName=@“C:\test.bat”;//替换字符串的模式
startInfo.UseShellExecute=false;
startInfo.CreateNoWindow=true;
startInfo.RedirectStandardOutput=true;
startInfo.WorkingDirectory=@“C:\TEST\”;
startInfo.RedirectStandardError=true;
//startInfo.UserName=“管理员”;
使用(Process batProcess=Process.Start(startInfo))
{
WriteLine(string.Format(“{0}| START |{1}{2}|{3}”),DateTime.Now,batProcess.StartTime,batProcess.Id,startInfo.FileName));
//控制台写入线(batProcess.s);
使用(StreamReader=batProcess.StandardOutput)
{
如果(!batProcess.WaitForExit(10000))
{
控制台。写入线(“杀死”);
尝试
{
batProcess.CloseMainWindow();
batProcess.Kill();
batProcess.WaitForExit();
控制台写入线(“退出”);
//WriteLine(“-->Killing进程ID{0},进程退出代码:{1},结束时间{2}\t”,
//batProcess.Id,batProcess.ExitCode,batProcess.ExitTime);
}
捕获(例外e)
{
控制台写入线(e.Message);
}
}
///WriteLine(“-->进程ID{0},开始时间{1}\t”,batProcess.ID,batProcess.StartTime);
弦线;
而((line=reader.ReadLine())!=null)
{
//列表。添加(行);
控制台写入线(行);
}
//写入控制台
//Console.WriteLine(“-----------\r\n”+结果+”-----------\r\n”);
//写入日志
//Common.WriteToLog(结果);
控制台写入线(结果);
WriteLine(string.Format(“{0}| END |{1}{2}|{3}”),DateTime.Now,batProcess.ExitTime,batProcess.Id,startInfo.FileName));
//Console.WriteLine(“-->Exit Process ID{0},Process Exit code:{1},结束时间{2},总处理时间{3}\t”,batProcess.ID,batProcess.ExitCode,batProcess.ExitTime,batProcess.TotalProcessorTime);
}
}
//如果(!batProcess.WaitForExit(25000))
//{
//Console.WriteLine(“-->进程ID{0},进程退出代码:{1},结束时间{2}\t”,batProcess.ID,batProcess.ExitCode,batProcess.ExitTime);
//Common.WriteToLog(batProcess.ExitCode.ToString());
//}
//否则
//{
//WriteLine(“Killing,进程退出代码:{0}”,batProcess.ExitCode);
//Process.GetCurrentProcess().Kill();
//}
}
}

使用CancellationTokenSource类将其作为参数传递给startnew,并将其作为方法中的参数使用,如需更好的说明,请参阅此-看起来像我需要的:-)使用CancellationTokenSource类并传递令牌后,谢谢您,进程继续返回结果,即使其已被终止且线程已取消。这就像是流程在某个地方运行并继续执行。我已经在任务管理器中选中了这一点,但任务一旦被终止,就会从菜单中消失。有什么想法吗?