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

わんくま同盟

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

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


■87557 / )  Re[5]: ロード中に表示するフォームを別スレッドで
□投稿者/ とっちゃん (495回)-(2018/06/05(Tue) 16:28:25)
No87555 (MTK さん) に返信

> エントリポイントで[STAThread]を宣言していてもTaskで実行するとMTAモードになるんですかね

Taskの中身は別のスレッドで動きます。
Taskで割り当てられるスレッド(ワーカースレッド)は、MTAで動作しているのでSTAにできません。


> スレッドがどこかに行ってしまうのであれば、ロード中フォームのスレッドを維持してやればいいんでしょうか?
平たく言えばそうなりますが、もしそうするなら、Taskではなく、Threadクラスを使って
長時間維持を前提としたスレッドにする必要があります(メソッド抜けたらなくなったではだめなので)。


> フォームはSTAでかつUIスレッドである必要がある というのは、
> フォームはメインスレッドで呼び出す必要があり、Task.Run のような別スレッドで呼び出してはいけないという理解で正しいでしょうか?
>
後述していますが、UIスレッドとなるSTAスレッドで動かせばよいとなります(UWPアプリを除く)。

>>詳細は省きますが、UIスレッドを自力で起こせない場合は、
>
> すいません、ここの部分は自分でも調べてみたのですが、まだ理解できていません。
> UIスレッドを自力で起こせない場合 というのが理解できていないのですが、どういう意味でしょうか?


UIスレッドは、ウィンドウ(UIオブジェクト)を作成してよいスレッドになります。
UIオブジェクトは、Windowsメッセージを処理するスレッドでのみ作成ができます。

Windowsメッセージを処理するとは、メッセージポンプがあるなどの言い方もしますが
Windows Forms アプリの場合は、Application.Run を呼び出したスレッドを指します。
(WPFの場合は、Dispatcher.Run(), UWPの場合はUIスレッドを自分で作ることはできない)

UIスレッドを自力で起こすというのは、具体的には、
1.Threadクラスを使って、カーネルスレッドを起動する。
2.内部で、Application.Run() を呼び出してメッセージポンプを稼働する。
3.適切な処理で終了するように作りこむ。

という3つを合わせた実装を指します。
具体的にどうすればいいか?はアプリケーションによるので、実例はあまりありません。



> 今回の例の場合はどうするべきでしょうか?

先に乗せたプログラムのようにすればいいと思います。

返信 編集キー/


管理者用

- Child Tree -