C# 除了在c中使用计时器之外

C# 除了在c中使用计时器之外,c#,C#,我正在尝试编写一个程序,该程序不需要使用计时器就可以一直执行一个方法。例如,我希望有一个程序,显示当前正在运行的进程的列表。显然,它在不断变化。我不想使用一个计时器,它每秒获取进程列表并将它们添加到列表中,因为它在我看来不是很优雅。有什么特别的方法吗?我怎样才能提供一项服务来实现这一点呢?如果你执意不使用计时器,你需要做以下事情: 在应用程序启动时获取列表或正在运行的进程 检测进程何时启动并将其添加到列表中 检测进程何时结束并将其从列表中删除 要检测进程的创建/终止,请查看以下答案: 方案1:

我正在尝试编写一个程序,该程序不需要使用计时器就可以一直执行一个方法。例如,我希望有一个程序,显示当前正在运行的进程的列表。显然,它在不断变化。我不想使用一个计时器,它每秒获取进程列表并将它们添加到列表中,因为它在我看来不是很优雅。有什么特别的方法吗?我怎样才能提供一项服务来实现这一点呢?

如果你执意不使用计时器,你需要做以下事情:

在应用程序启动时获取列表或正在运行的进程 检测进程何时启动并将其添加到列表中 检测进程何时结束并将其从列表中删除 要检测进程的创建/终止,请查看以下答案:

方案1:

您可以开发一个持续运行的Windows服务。不需要定时器。如果你能给我们提供更多的细节,我们可以想出更好的解决方案。但是请记住,窗口服务不可能进行用户交互

正在运行的进程被添加到observablecollection。添加项目时,会引发CollectionChanged事件

方案2:


您可以有一个程序,其中希望运行进程的列表作为Web服务公开,Web服务在Program1中使用。在program1的CollectionChanged eventhandler中,您可以调用program2 webservice并通知新添加的进程。

我不同意关于计时器是此处唯一或最佳答案的评论。希望在发生变化时得到提醒,而不是进行投票,这是一种高尚的追求。我相信您正在寻找WinAPI挂钩,但我不知道是哪一个,也不知道它是否存在


另外:

就我个人而言,我会坚持使用计时器。它真的很优雅。但是,如果你真的想要更有活力的东西,那就继续读吧

随着新的async和Wait关键字被包含在C5.0中,我们可能会看到计时器变得越来越不复杂。下面是如何在没有计时器的情况下使用

很奇怪吧?这可能不是如何使用async和await的理想示例,但您明白了这一点。这是未来的潮流


不要误会我。始终需要传统的计时器类。

您可以生成一个具有无限优先级的低优先级线程,直到进程退出循环,以定期更新进程列表。如果没有关于您正在使用的控件类型或其他信息,我无法在控件更新委托方面真正帮助您,但是您的函数的大致框架是:

    private void processUpdater()
    {
        while (true) //not the most elegant way to implement a pseudo-infinite loop, but you can figure out how you want to signal it to end.
        {
            var runningProcesses = Process.GetProcesses().Where(p => !string.IsNullOrEmpty(p.MainWindowTitle)).Select(p => p.MainWindowTitle); //filter the running processes to get those with open windows.
            this.lstProcesses.Invoke((MethodInvoker)delegate { this.lstProcesses.Items.Clear(); }); //thread-safe invocation to clear the current items
            this.lstProcesses.Invoke((MethodInvoker)delegate { this.lstProcesses.Items.AddRange(runningProcesses.ToArray<string>()); }); //add the new set of windowed processes
            System.Threading.Thread.Sleep(5000); //update the list every 5 seconds
        }
    }

显然,这是一个非常基本的实现,但希望它能让您大致了解如何做您想做的事情。

这正是计时器的用途。我想计时器的唯一选项是无限,而更不用说您必须自己做所有的工作,例如间隔等。,但我仍然支持anthony所说的。可能重复的是,据我所知,当Windows创建一个进程时,没有一个ProcessMonitor类可以接收事件,所以你唯一的办法就是轮询,这通常涉及某种计时器。我想敲钉子,但我就是受不了锤子!有人有更好的解决方案吗?我不认为链接答案中建议的解决方案适用于无头流程。您已经提供了一个可能的解决方案以及不在同一答案中使用它的原因。。。没有真正解决这个问题。你读过这个问题吗?windows服务是我最初提出的,但不知道如何实现它。我只需要得到一个正在运行的进程列表,并将它们添加到列表中。它应该是活动的,这意味着一旦进程启动,它就会自动添加到列表中。@programmer93我提出了一个有点做作的解决方案。希望这有帮助。WebService?听起来有点混乱。。。你能给我举个例子吗?在我的例子中,把它放在一个线程上,并将它的优先级设置为低或低于正常值实际上是一个好主意。那帮了大忙,谢谢!
    private void processUpdater()
    {
        while (true) //not the most elegant way to implement a pseudo-infinite loop, but you can figure out how you want to signal it to end.
        {
            var runningProcesses = Process.GetProcesses().Where(p => !string.IsNullOrEmpty(p.MainWindowTitle)).Select(p => p.MainWindowTitle); //filter the running processes to get those with open windows.
            this.lstProcesses.Invoke((MethodInvoker)delegate { this.lstProcesses.Items.Clear(); }); //thread-safe invocation to clear the current items
            this.lstProcesses.Invoke((MethodInvoker)delegate { this.lstProcesses.Items.AddRange(runningProcesses.ToArray<string>()); }); //add the new set of windowed processes
            System.Threading.Thread.Sleep(5000); //update the list every 5 seconds
        }
    }
var tUpdater = new System.Threading.Thread(processUpdater);
tUpdater.Priority = System.Threading.ThreadPriority.BelowNormal;
tUpdater.Name = "Process List Updater";
tUpdater.Start(); //start the thread running.