我需要有关流程的帮助。在我的应用程序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并不是真的需要,但是认真 - 我已经尝试了一切,不知道我怎么能让它发挥作用..
感谢您的帮助!
答案 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?
谢谢!