■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( ()=> データロードの時間のかかる処理() );
// 処理終了後に何かやりたいなら、ここでやる(ログイン中...に変える?)
}
という感じにすれば、安定すると思いますよ。
書きなぐりコードなので、自分の都合に合わせて直してくださいね。
|
|