|
分類:[C#]
お世話になります。
現在フォームが10個以上作成してあり、フォーム上のボタンを押すと必要なデータをロードして次のフォームが開くようになっています。
必要なデータをロードする時間が結構かかるため、ロード中に「ロード中」のような画面をフォームで前面出したいです。
そこで「ロード中」フォームを作って、データをロードしている間は別スレッドでそのフォームを起動させようと試みています。
最初に「ロード中」フォームを初期化して別スレッドで表示はできるのですが、その後に別のフォームからアクセスしようとすると
InvalidAsynchronousStateException「メソッドの呼び出し中にエラーが発生しました。 あて先のスレッドは存在しません」とエラーになります。
以下、プログラム ※LoadScreenFormというのが「ロード中」フォームのことです。
FormManager.cs
--------------------------------------------------
// ロード画面用フォーム
public static LoadScreenForm loadForm;
// Invokeで呼び出すためのdelegate
private delegate void loadFormDelegateString(string txt);
// Invokeで呼び出したい関数を登録する
private loadFormDelegateString test;
public FormManager(string[] args)
{
// ロード画面初期化、表示 ※これは成功します
this.InitLoadFormAsync();
}
public async void InitLoadFormAsync()
{
await Task.Run(() =>
{
// ロード中フォーム
loadForm = new LoadScreenForm();
loadForm.Show();
});
this.test = new loadFormDelegateString(loadForm.SetLoadText);
loadForm.Invoke(this.test, "ログイン中...");
}
public void SetLoadText(string text)
{
// ロード中のフォームに指定した文字を表示させる
loadForm.Invoke(this.test, text);
}
--------------------------------------------------
TopMenuForm.cs ※「this.bugyoMgr」には上記FormManager.csのインスタンスが入っています
--------------------------------------------------
private void OnLoad(object sender, EventArgs e)
{
this.formMgr.SetLoadText("会社データロード中..."); // ここでエラー
}
--------------------------------------------------
以上、分かりにくかったら申し訳ないですが、教えて頂けないでしょうか。
|