如何从控制台应用程序正确关闭winforms应用程序

时间:2016-08-11 08:07:38

标签: c# winforms task-parallel-library

我想从控制台应用中正确关闭winform应用程序。所以我尝试这样的事情:

                var cancelSource = new CancellationTokenSource();
                if (runUI)
                {
                    var UI = new FormUI(somedata);

                    //cancel request if form is closing.
                    UI.FormClosing += (sender, args) =>
                    {
                        cancelSource.Cancel();
                    };


                    Task.Factory.StartNew(() =>
                    {
                        //run form from console app.
                          Application.Run(UI);

                    }, cancelSource.Token);
                }

但是当我点击表单上的X按钮时,我得到了空引用异常,我不知道它被抛出的位置。 enter image description here 那么如何正确地做到这一点?

更新: 更清楚。我的控制台应用程序只读取用户命令,然后执行一些处理数据方法。如果用户编写命令来显示UI我想打开新表单并通过构造函数传递数据。这些数据会发生变化,因此我每5秒刷新一次此表单视图。主要目的是使数据处理独立于表单。但是当我关闭该表单时,抛出了null引用异常。使用取消只是在表单关闭时尝试终止此任务。

接下来回答我做这样的事情:

            var data = new Data(...)
            var thread = new Thread(() =>
            {
                data.Execute();
            });
            thread.Start();

            if (runUI)
            {
                var UI = new FormUI(data);
                Application.Run(UI);
            }

但是当我关闭表单时,它仍然会给我错误。

1 个答案:

答案 0 :(得分:0)

我不确定您正在尝试使用取消逻辑等等。但如果您使用主线程上的表单构建您的应用程序,那么它非常简单。

尽管表单已关闭,_dataThread仍会继续运行。

_dataThread = new Thread(MyDataProcessingLoop)
_dataThread.Start()
if(runUI){
    _uiForm = new UIForm();
    Application.Run(_uiForm);
}else{
    Application.Run(); //Keep the application running
}