我正在尝试编写一个程序来继续执行方法而不必使用计时器。例如,我想要一个显示当前正在运行的进程列表的程序。显然,它在不断变化。我不想使用每秒获取进程列表的计时器并将它们添加到列表中,因为它对我来说看起来不太优雅。有什么特别的方法吗?我怎样才能提供能够实现这一目标的服务呢?
答案 0 :(得分:4)
就个人而言,我会坚持使用计时器。它真的很优雅。但是,如果你真的想要一些更多的pizazz,那么请继续阅读!
当新的async
和await
关键字(包含在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);
}
}
}
很奇怪啊?它可能不是假设使用async
和await
的理想示例,但您明白了。这是未来的潮流。
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)
如果您没有使用计时器,则需要执行以下操作:
要检测流程创建/终止,请查看以下答案:
答案 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