2017-09-05 55 views
1

我有两个程序相互冲突。其中一个是由Task Scheduler(Program1)在半夜启动的C#控制台应用程序,另一个(Program2)是一个通常由用户在白天运行的C#WPF程序。我尝试使用以下方法来从PROGRAM1关闭Program2中:如何从TaskScheduler运行时查找/关闭进程?

public static void CloseProgram2() 
{ 
    var process = System.Diagnostics.Process.GetProcessesByName("Program2").FirstOrDefault(); 
    if (process != null) 
    { 
     if (process.CloseMainWindow()) 
     { 
      SpinWait.SpinUntil(() => null == System.Diagnostics.Process.GetProcessesByName("Program2").FirstOrDefault(), 
       TimeSpan.FromSeconds(30)); 
     } 
    } 
} 

出于某种原因,当PROGRAM1从运行的TaskScheduler Program2中不会关闭。但是,如果我手动运行Program1,它总是关闭Program2。我有任务计划程序设置为提供凭据,以便Program1运行,无论是否有人登录到计算机。我注意到Program1的输出窗口在从Task Scheduler运行时不显示,但它确实成功运行。我想知道是否Task Scheduler正在运行Program1,使得它看不到Task Scheduler未启动的进程,这就是为什么Program2没有关闭的原因。

当使用TaskScheduler运行Program1时,任何想法或解决方案都可以帮助我关闭Program1中的Program2,这将不胜感激。

+0

没有一个好的[mcve]来回答你的问题是不可能的,它可以可靠地重现问题。这将包括有关如何设置Task Scheduler任务的详细_详细信息(最好是安装该任务的_code_)。但似乎几乎可以肯定的是,问题与运行控制台程序的用户帐户以及该程序能够看到和/或终止的进程有关。 –

+0

如果您将日志记录添加到控制台和WPF程序中,则可以更有效地进行调试,以便每个人都可以报告与其操作相关的事情(返回哪些进程,是否收到“WM_CLOSE”消息等) –

回答

0

找到了另一种使用方法。除了使用proccess.CloseMainWindow的(),我创建了如下的批处理文件:

taskkill /F /IM Program2.exe 

然后就是跑从任务计划该批处理文件。

奇怪的是,我需要在bat文件中的taskkill命令之前放一个空行。没有它,我会得到一堆乱码,它说它不知道如何运行该命令。几乎就像在taskkill命令之前插入了垃圾一样。非常奇怪...

相关问题