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

わんくま同盟

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

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


■87552 / )  Re[3]: ロード中に表示するフォームを別スレッドで
□投稿者/ とっちゃん (494回)-(2018/06/05(Tue) 12:08:56)
No87551 (MTK さん) に返信
> ・ロード中フォームを別スレッドで出して、その後にアクセスする方法
Invoke() を使えばOKです。
この部分については問題ありません。

> ・エラーが発生している原因と解決策
Task.Run() で作成部分だけスレッドアウトした形にしていますよね?
フォームを作成したらタスクが終了してしまうため、
そのフォームを作ったスレッドがどこかに行ってしまいます。

また、Taskで割り当てされるスレッドは、MTAモードなので、フォーム作成を行うのには向きません。


> です。
> 
> 発生場所については
> TopMenuForm.cs の
>>this.formMgr.SetLoadText("会社データロード中...");  // ここでエラー
> 
> というところまでは分かっています。

この部分は、await から戻ってきてから動く部分ですよね?

フォームは、STAで動かす必要があり、なおかつそのSTAは、UIスレッドである必要があります。
詳細は省きますが、UIスレッドを自力で起こせない場合は、メインスレッド(メインのフォームを作成しているスレッド)で
フォームを作り、時間のかかる処理を別スレッドにするほうが構造上は安定します。

今回のようなプログラムであれば

public  void InitLoadFormAsync()
{
	loadForm = new LoadScreenForm();
	loadForm.Show();
}
private async void OnLoad(object sender, EventArgs e)
{
	SetLoadText( "会社データロード中..." );	//	中身はInvokeではなく直接セットに変える(実装がぐちゃぐちゃで実現できないので省略)
	await Task.Run( ()=> データロードの時間のかかる処理() );
	//	処理終了後に何かやりたいなら、ここでやる(ログイン中...に変える?)
}

という感じにすれば、安定すると思いますよ。
書きなぐりコードなので、自分の都合に合わせて直してくださいね。

返信 編集キー/


管理者用

- Child Tree -