压制"服务器忙...切换到/重试"对话

时间:2014-05-30 17:14:15

标签: c# process inkscape

我使用Inkscape使用以下代码将图像从PDF转换为SVG:

internal static void ConvertImageWithInkscapeToLocation(string baseImagePath, string newImagePath, bool crop = true)
{
    InkscapeAction(string.Format("-f \"{0}\" -l \"{1}\"", baseImagePath, newImagePath));
}

internal static void InkscapeAction(string inkscapeArgs)
{
    Process inkscape = null;

    try
    {
        ProcessStartInfo si = new ProcessStartInfo();
        inkscape            = new Process();

        si.WindowStyle      = System.Diagnostics.ProcessWindowStyle.Hidden;
        si.FileName         = inkscapePath; // the path to Inkscape.exe, defined elsewhere
        si.Arguments        = inkscapeArgs;
        si.CreateNoWindow   = true;
        inkscape.StartInfo  = si;

        inkscape.Start();
    }
    finally
    {
        inkscape.WaitForExit();
    }
}

这是一个相当直接的#34;启动应用程序的参数,等待关闭"设置好,效果很好;唯一的问题是在较慢的机器上,图像转换过程(可能是inkscape.WaitForExit())花费的时间太长,并显示此对话框消息:

Server Busy Dialog Box

点击"切换到..."弹出Windows开始菜单(我猜测因为我隐藏了这个过程); "重试"将一遍又一遍地重新发送消息,直到该过程结束。 是否可以完全压制消息框,并自动重试直到它通过?我可以在显示消息之前至少延长超时吗?

1 个答案:

答案 0 :(得分:3)

有一些方法可以做到:

1-A脏的廉价方式是等待超时(WaitForExit(超时)),做一个DoEvents(我假设你是在主线程的winforms应用程序中做的),检查进程是否完成并循环直到它:

finally
{
    while(!inkScape.HasExited)
    {
        inkscape.WaitForExit(500);
        Application.DoEvents();
    }

}

2 - 正确的方法是在另一个线程中执行,然后发出主程序的信号以继续

ThreadPool.QueueUserWorkItem((state) => { ConvertImageWithInkscapeToLocation...  });

如果你在另一个线程中执行它,请记住CrossThreadException,不要从线程更新UI。