等待任务中的进程

时间:2012-12-12 10:33:05

标签: c# winapi task-parallel-library

我正在尝试执行以下操作: 我有一个带网格的窗口,在每个单元格中我想显示一台远程计算机(使用VNC)。为此,我启动流程并将它们放在面板中。

我的问题是我必须等待该过程成为某个窗口(因为验证窗口会在我想要的真实窗口之前显示一小段时间。)

因此,对于我必须开始的每个过程,我都这样做:

Task t = Task.Factory.StartNew(() =>
{
    Process proc = Process.Start(@"C:\Program Files\RealVNC\VNC4\vncviewer.exe", name + " -Scaling AspectFit -Enabletoolbar=0");
    Thread.Sleep(4000); // Wait for real window
    this.BeginInvoke((MethodInvoker)delegate
    {
         AddProcessToTable(proc, name); // Adds the window in the panel
    });
});

它工作正常;但是如果我想用这个替换Thread.Sleep()

while (!proc.MainWindowTitle.Contains(name))
    Thread.Sleep(10);

但是当我这样做时,我的流程已启动,但它们不会进入面板。我把断点检查了,而while和after之后的行都被执行了,所以我不知道哪里出错了... 必须有可能,因为this guy做到了。

仅供参考,这是将进程添加到TableLayoutPanel的函数:

void AddProcessToTable(Process proc, string name)
{
    Control panel = null;
    // ...
    // Retrieving panel
    // ...

    SetParent(proc.MainWindowHandle, panel.Handle);
    SendMessage(proc.MainWindowHandle, 274, 61488, 0);
}

1 个答案:

答案 0 :(得分:0)

而不是Thread.Sleep,为什么不使用proc.WaitForInputIdle(),它将等待进程进入其主窗口的消息循环并准备输入。有http://msdn.microsoft.com/en-us/library/8d7363e2.aspx的文档,我发现(但未测试)有关如何在http://www.akadia.com/services/dotnet_process_handling.html使用它的文章

Process process = new Process();
    process.StartInfo.FileName = "Notepad";
    process.Start();

    process.WaitForInputIdle();

    Thread.Sleep(5000);
    if(!process.CloseMainWindow())
    {
        process.Kill();
    }