除了在c#中使用计时器

时间:2012-04-13 01:55:13

标签: c#

我正在尝试编写一个程序来继续执行方法而不必使用计时器。例如,我想要一个显示当前正在运行的进程列表的程序。显然,它在不断变化。我不想使用每秒获取进程列表的计时器并将它们添加到列表中,因为它对我来说看起来不太优雅。有什么特别的方法吗?我怎样才能提供能够实现这一目标的服务呢?

5 个答案:

答案 0 :(得分:4)

就个人而言,我会坚持使用计时器。它真的很优雅。但是,如果你真的想要一些更多的pizazz,那么请继续阅读!

当新的asyncawait关键字(包含在C#5.0中)引起注意时,我们可能会看到计时器变得更加冷却 1 。现在使用Async CTP即可在没有计时器的情况下执行此操作。

private async void ShowProcessesButton_Click(object sender, EventArgs args)
{
  while (true)
  {
    await Task.Delay(1000);  // TaskEx.Delay in the CTP
    YourListBox.Items.Clear();
    foreach (Process p in Process.GetProcesses())
    {
      YourListBox.Items.Add(p.ProcessName);
    }
  }
}

很奇怪啊?它可能不是假设使用asyncawait的理想示例,但您明白了。这是未来的潮流。


1 别误会我的意思。总是需要传统的计时器类。

答案 1 :(得分:1)

您可以生成具有无限的低优先级线程(直到进程退出)循环以定期更新进程列表。如果没有关于你正在使用什么样的控件的更多信息,或者有什么我无法真正帮助你使用Control更新代表,但是你的函数的粗略骨架将是:

    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
        }
    }

在我的情况下,我只是使用windows捕获进程,并在列表框中列出这些窗口标题(lstProcesses)

现在,要产生这个线程:

var tUpdater = new System.Threading.Thread(processUpdater);
tUpdater.Priority = System.Threading.ThreadPriority.BelowNormal;
tUpdater.Name = "Process List Updater";
tUpdater.Start(); //start the thread running.

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

答案 2 :(得分:0)

如果您没有使用计时器,则需要执行以下操作:

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

    https://stackoverflow.com/a/3556280/64290

答案 3 :(得分:0)

<强> PROGRAM1:

您可以开发持续运行的Windows服务。无需计时器。如果您可以提供更多详细信息,我们可以提供更好的解决方案。但请记住,窗口服务无法进行用户交互。

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

<强> Program2中:

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

答案 4 :(得分:0)

我不同意这些意见,表明计时器是这里唯一或最好的答案。当发生变化而不是对其进行轮询时,希望被警告是一种崇高的追求。我相信你正在寻找一个WinAPI“Hook”,但我不知道哪一个或它是否存在。

请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ms644959%28v=vs.85%29.aspx

另外:Win API: Hook every window show or process execution