■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 -