![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
親クラスウィンドウのボタンを押すと子クラスを作成して実行し、
子クラスは処理の経過や結果を親クラスに通知する、
というような処理をするために、下のようなコードを書きました。
(主要な部分のみの抜粋です。)
子クラスでは、親クラスへの通知後も引き続いて処理できるよう、
親クラスに対して非同期で通知したいため、
BeginInvoke を使用することにしました。
実行すると、「★A★」で親クラスに通知を実行した際、
・「★B★」は本来モーダルのはずが裏に回ってしまう
・「★C★」ではクロススレッド呼び出し方法の例外が発生
という問題が生じます。
BeginInvokeするとUIスレッドとは別のスレッドとしてChildEnventReceivedが呼ばれるためと解釈しています。(ほんとかな。)
こういったことをしたい場合、どうするのが普通でしょう?
下のコード自体はだいたい合っていて、
コントロールの操作は例えば「★C★」ではbtn.Invoke()するのが普通でしょうか?
とすると、そのためのdelegateやメッソドを定義しなければならず、
煩雑になりますね。
C++のPostMessageのようなことがやりたいだけなのですが。
C#は最近取り組み始めたばかりで、勉強中です。
普通はこうする、というような処理をご教授いただければ幸いです。
よろしくお願いします。
================================================
// 子クラスからの通知イベント
delegate void EventHandler();
public Parent
{
EventHandler handler;
private void btn_Click(object sender, EventArgs e)
{
btn.Enabled = false;
handler = new EventHandler(ChildEventReceived);
Child child = new Child();
child.SendEvent += hander;
child.Exec();
}
void ChildEnventReceived();
MessageBox.Show("Child State Received");
★B★このメッセージボックスが裏に隠れてしまう★B★
btn.Enabled = true;
★C★この操作は「有効でないスレッド間の操作」となる★C★
}
}
class Child
{
public event EventHandler SendEvent;
public void Exec()
{
★A★ここで親に対して通知する★A★
SendEvent.BeginInvoke(null, null);
}
}
================================================
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
using System;
using System.Threading;
using System.Windows.Forms;
delegate void EventHandler();
public class Parent:Form{
EventHandler handler;
Button btn;
public Parent(){
btn=new Button();
btn.Text="Exec";
btn.Click+=this.btn_Click;
Controls.Add(btn);
}
private void btn_Click(object sender, EventArgs e){
btn.Enabled = false;
// ★そもそも処理は UI スレッドではなく別スレッドでするのでは?★
// UIスレッドで処理をすると終わるまで Form が固まります。
// Form のメッセージを適宜処理する為に Application.DoEvents を Exec 内で定期的に呼び出す事もできますが、
// 同期的な実行になるので今回の非同期的に実行するという目的に適いません。
new Thread(new ThreadStart(()=>{
handler = new EventHandler(ChildEventReceived);
Child child = new Child();
child.SendEvent += handler;
child.Exec();
})).Start();
}
void ChildEventReceived(){
// ★Form.BeginInvoke を使えば、その Form の UI スレッド上で非同期的に実行される。★
this.BeginInvoke(new Action(()=>{
MessageBox.Show("Child State Received");
btn.Enabled = true;
}));
}
public static void Main(){
Application.Run(new Parent());
}
}
class Child{
public event EventHandler SendEvent;
public void Exec(){
Thread.Sleep(1000); // 重い処理など
// ★イベント自体の発火は同期で良いかと思います★
// 同期的に実行するかどうかは handler に任せた方が自然だと思います
if(SendEvent!=null)SendEvent();
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java java final 1 2022/06/10 22:49
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- JavaScript 指定したパスが現URLに含まれていたら特定要素を削除するJavascriptのコードを教えてください 2 2023/04/27 17:58
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- HTML・CSS html/cssで要素が出てこなくて困ってます 1 2022/12/31 16:59
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java リフレクションについて
-
クラス間でのデータ参照
-
関数内の変数に<summary>コメン...
-
構造 他のクラスの構造体を別...
-
内部クラスのインスタンスを外...
-
C#のクラスライブラリでメッセ...
-
VB.NETで出来てC#で出来ない???
-
クラスに行って、戻ってくる方...
-
C++で親クラスの関数を呼び出す...
-
C++でfriendクラスにしているの...
-
C++/C#間での構造体の引き渡し...
-
static変数を持ったクラスを継...
-
無名パッケージからのインポート
-
範囲外の数値を代入したらエラ...
-
c++,ある関数のクラスから別の...
-
Strategyパターンを用いた実装...
-
javaの配列について質問です。
-
import と extends について
-
C,C++,C++/CLIの構造体とクラス
-
SwingでgetContentPaneのエラー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
クラス間でのデータ参照
-
範囲外の数値を代入したらエラ...
-
関数内の変数に<summary>コメン...
-
c++,ある関数のクラスから別の...
-
C#にて別クラスの関数を使いたい
-
java-別クラスの変数の使い方を...
-
C++でfriendクラスにしているの...
-
a href="..." とServlet
-
親クラスから子クラスへアクセス。
-
構造 他のクラスの構造体を別...
-
Java リフレクションについて
-
import と extends について
-
C#でほかのファイルにある自作...
-
C#のクラスライブラリでメッセ...
-
Java
-
アップキャスト、ダウンキャス...
-
無名パッケージからのインポート
-
違うクラスからの変数の共有化
-
SwingでgetContentPaneのエラー...
-
ひとつのファイルにクラスは1つ?
おすすめ情報