C#で対戦型カードゲームを作成しています。
Socketによる通信を介して対戦の機能を実装しようとしていて、現在はフォームの遷移を行う機能を実装しています。
二人のユーザの準備が完了すれば、サーバからゲーム開始の通知が送信され、それを受信したのちにそれぞれのユーザがゲーム用のフォームへと遷移する機能を実装しています。
遷移前のフォームから遷移先のフォームへ移る際の処理の中でInvokeメソッドを呼んでいるのですが、その際にプログラムが停止してしまいます。
デバッグでステップ実行をしても、その前段階でエラーなどは起きておらず、Invokeメソッドを実行する段階で急に止まってしまいます。エラーメッセージなども出ないため、どのように調べればよいかも分かりません。
何とか他に使えるメソッドがないか調べ、InvokeメソッドをBeginInvokeメソッドに変えることでプログラム自体は動くようになったのですが、なぜBeginInvokeメソッドに変更するとプログラムが停止しなくなるのかが分かりません。
この現象について何が起こっているのかが知りたいです。
具体的に何が起こっているかや、どのような検索キーワードで調べればよいかなど、教えてください。
下記に関係がありそうな部分のソースコードは記載していますが、足りない情報などがあればそれも教えてください。
発生している問題・エラーメッセージ
コントロールのInvokeメソッドを呼ぶとプログラムが停止する。 (追記) エラーメッセージは出力されませんでした。
該当のソースコード
フォームの遷移を行うための記述
C#
1static class Program 2 { 3 private static ApplicationContext mainApplicationContext; 4 /// <summary> 5 /// The main entry point for the application. 6 /// </summary> 7 [STAThread] 8 static void Main() 9 { 10 Application.SetHighDpiMode(HighDpiMode.SystemAware); 11 Application.EnableVisualStyles(); 12 Application.SetCompatibleTextRenderingDefault(false); 13 mainApplicationContext = new ApplicationContext(); 14 15 View.StartView view = new View.StartView(); 16 view.FormClosed += new FormClosedEventHandler(FormClosed); 17 mainApplicationContext.MainForm = view; 18 Application.Run(mainApplicationContext); 19 } 20 private static void FormClosed(object sender, EventArgs e) 21 { 22 if (sender.GetType().BaseType != typeof(View.ViewBase)) { return; } 23 24 View.ViewBase NextView = ((View.ViewBase)sender).NextView; 25 if (NextView == null) { return; } 26 mainApplicationContext.MainForm = NextView; 27 NextView.FormClosed += new FormClosedEventHandler(FormClosed); 28 NextView.Show(); 29 } 30 }
画面遷移をするフォームに継承しているViewBase
MoveViewメソッドを呼んでデバッグしながらステップ実行をすると、
Invoke(d, new object[] { view });
の行でプログラムが停止してしまいます。
C#
1internal class ViewBase : Form 2 { 3 private delegate void MoveNextView(ViewBase view); 4 internal ViewBase NextView { get; set; } 5 6 internal void MoveView(ViewBase view) 7 { 8 if (InvokeRequired) 9 { 10 var d = new MoveNextView(MoveView); 11 Invoke(d, new object[] { view }); 12 } 13 else 14 { 15 NextView = view; 16 Close(); 17 } 18 } 19 }
試したこと
InvokeメソッドをBeginInvokeメソッドに変更する
=>プログラムは停止しないようになったが理由が分からない。
回答1件
あなたの回答
tips
プレビュー