2016-08-11 10 views
1

コンソールアプリケーションからwinformアプリケーションを正しく閉じたいと思っています。だから私はこのような何かしてみてください:コンソールアプリケーションからwinformsアプリケーションを正しく閉じる方法

   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ボタンをクリックしたとき、私はnull参照の例外を持っていると私はそれがスローされた場所を知りません。 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); 
      } 

をしかし、私は、フォームを閉じたときに、それはまだ私にエラーを与えます。

+0

あなたのUIフォームはメインスレッドで作成されていますが、別のスレッドでメッセージループを開始します。フォームとそのメッセージループの作成は、同じスレッド上になければなりません。 UIフォームが終了すると、Application.Runメッセージループも終了し、スレッドも終了します。キャンセルトークンが必要な理由がわかりません。あなたのメインスレッドが何をしているのかを教えていただければ、uiフォームが終了したときにそれを終了させる方法についてのいくつかの示唆を与えることができます。 – FloatingKiwi

+0

コンソールアプリケーションはコンストラクタを介してこのフォームにデータを渡します。 5秒ごとにデータを更新し、表示します。 – TjDillashaw

+0

単にスレッドを交換することをお勧めします。プログラムがあなたのデータスレッドを起動するとき。その後、メインプログラムスレッドでApplication.Run(UI)を呼び出します。データスレッドがバックグラウンドスレッドとして設定されている場合、uiが実行すると自動的に終了します。 – FloatingKiwi

答えて

0

キャンセルロジックなどで何をしようとしているのかよく分かりませんが、メインスレッドのフォームでアプリを実行した場合は非常に簡単です。

_dataThreadは、フォームが閉じていても実行され続けます。

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

私はより明確になるように投稿を更新しました。私はあなたのソリューションを試しても、まだnull参照例外を与える。 – TjDillashaw

+1

Debug - > Exceptions - > Clr Exceptions - > Thrownにチェックが入っていることを確認してください。例外が発生するたびに実行を停止します。スタックトラックを調べます。これはあなたのフォームのthatsの閉鎖ではない、それは何かのフォームは、出口の後にそれを変更しようとしているタイマは、終了後にそれと対話しようとしています。また、アプリケーションにいくつかのロギングを実装して、この推測作業を行う必要はありません。 – FloatingKiwi

+0

あなたは正しいです。この例外をチェックする方法を教えてくれてありがとう。問題は、私がフォームを閉じた後にもうexsistし​​ないものを操作しようとしていたことでした。 – TjDillashaw

関連する問題