立即启动过程,不冻结应用程序

时间:2013-12-05 13:46:28

标签: c# wpf process

我需要有关流程的帮助。在我的应用程序im打印receipes。直到今天每次用户打印它,应用程序被冻结,直到打印收据。所以我决定使用具有后台优先级的Process。实际上它是有效的 - 用户可以在打印收据的同时使用应用程序。问题是,我有功能重新用户每个X receipes打印。它就像

一样
if (current_receipt_index_in_DB % restart_every_X_receipt == 0) - restartApp;

因此,如果当前索引= 20,并且X = 2,则每2个收据重新开始。

问题是,现在,当我在后台处理打印收据时,需要从代码重新启动应用程序 - 收据根本不打印。

代码:

        PrintReceipt prRec = new PrintReceipt();
        Thread t = new Thread(new ThreadStart(() => prRec.PrintReceiptParagon(....parameters....)));
        t.SetApartmentState(ApartmentState.STA);
        Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
                {
                    t.Start();
                }));

并重启应用程序的功能:

    string appPath = System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
    Process[] procs = Process.GetProcessesByName("myApp.exe");

    Process.Start(System.IO.Path.Combine(appPath, "myApp.exe"), "-restart " + paramID);
    Application.Current.Shutdown();
    Thread.Sleep(2000);

    foreach (Process p in procs)
    {
        p.Kill();
    }

嗯,可能那些p.Kill并不是真的需要,但是认真 - 我已经尝试了一切,不知道我怎么能让它发挥作用..

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您需要将收据打印过程另一个EXE。使其成为一个Console应用程序,它接收必要的命令行参数。当你开始它时:

ProcessStartInfo psi = new ProcessStartInfo(pathToExe, args);
psi.WindowStyle = ProcessWindowStyle.Hidden;
Process.Start(psi);

答案 1 :(得分:0)

嗯,我做到了,但仍有一点问题。

解决方案:

我创建两个线程,如:

        t_par = new Thread(
            () =>
            {

                PrintReceipt prRec = new PrintReceipt();
                prRec.PrintReceiptParagon(--parameters--);


            });

第二个几乎相同,但运行代码以重新启动应用程序。

在window.loaded中:

 if (t_par != null)
                   {
                       t_par.Start();
                       t_par.Join();


                       if (Functions.thr != null)
                       {
                           Functions.thr.Start();
                       }
                   }

哪个线程逐个运行 - 对我来说没问题。

但现在的问题是,打印收据时应用程序冻结(从按钮点击完成打印需要3/4秒)。

如何“解冻”GUI?

谢谢!