C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■87549 / )  ロード中に表示するフォームを別スレッドで
□投稿者/ MTK (66回)-(2018/06/05(Tue) 11:22:32)

分類:[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("会社データロード中...");  // ここでエラー
}

--------------------------------------------------


以上、分かりにくかったら申し訳ないですが、教えて頂けないでしょうか。

返信 編集キー/


管理者用

- Child Tree -