我有一个小应用程序,客户端用来手动更新某些数据。这是非常基本的;在加载时,它会填充用户可以选择的公司列表,然后单击按钮以更新另一个系统中的数据。客户端希望能够从命令行运行相同的功能,因此我添加了后台工作程序。当应用程序启动时,我检查一个特定的arg,如果发现我启动了工作人员。一旦工人完成,我调用Close();
这一切似乎工作正常(数据按预期更新,应用程序似乎关闭),但当我检查任务管理器时,应用程序仍在运行。
我的问题:
以下是代码示例:
public MainForm()
{
InitializeComponent();
var args = Environment.GetCommandLineArgs();
Array.ForEach(args, x => x.ToLower());
if (args.Contains("u"))
backgroundWorker.RunWorkerAsync();
}
private void BackgroundWorkerDoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
//call to web service to update data
}
private void BackgroundWorkerRunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
Close();
}
答案 0 :(得分:3)
2)有更好的方法吗?
您可以从Console App运行代码,并确保没有WinForms / Threading问题。
作为对此的修改,您可以直接在Main()中检查命令行,甚至不执行Application.Run(mainForm)。
答案 1 :(得分:0)
尝试调用Application.Exit(),而不是调用Close()。这将结束应用程序,而不仅仅是关闭表单。
答案 2 :(得分:0)
backgroundworker在另一个线程中,而不是UI线程。
在UI线程中创建一个处理东西(在这种情况下停止)的委托。 Example here