STAおよびMTAスレッドモード

はじめに:数日前にコンピュータールームをリファクタリングしたときに、目に見えないエラーが発生しました。これはスレッドの問題でした。

ここに写真の説明を挿入
Du Niangとの会話の後、解決策を見つけましたが、それでもスレッドの問題を理解できませんでした
。オンラインの神々によって与えられた2つの一般的な解決策があります。1つ
ここに写真の説明を挿入
目は、プログラムのメイン関数エントリに[STAThread]を追加することです
(プロテストは効果的です)
2つ目は特定のコードで使用する必要があり、使用しませんでしたが、偉大な神は問題を解決できるはずだと言いました。
問題は解決されましたが、何が起こっているのかわかりませんが、それでもチェックしています。

このエラーの主な理由は次のとおりです。

ユニットは、プロセス内で同じスレッドアクセス要件を持つオブジェクトの論理コンテナです。同じユニット内のすべてのオブジェクトは、ユニット内の任意のスレッドから呼び出しを受信できます。.NET Frameworkはユニットを使用せず、管理対象オブジェクト自体がすべての共有リソースをスレッドセーフな方法で使用する責任があります。COMクラスはユニットを使用
するため、COM相互運用の場合、COMオブジェクトを呼び出すときに、共通言語ランタイムはユニットを作成して初期化する必要があります。管理対象スレッドは、1つのスレッドのみを許可するシングルスレッドアパートメント(STA)または1つ以上のスレッドを含むマルチスレッドアパートメント(MTA)を作成して入力できます。
スレッドのApartmentStateプロパティをApartmentState列挙値の1つに設定することにより、作成されるユニットのタイプを制御できます。特定のスレッドはCOMユニットを1回しか初期化できないため、アンマネージコードを最初に呼び出した後でユニットタイプを変更することはできません。

では、STAシングルスレッドおよびMTAマルチスレッドとは何ですか?どのような違いがありますか

STAThread:シングルスレッドアパートメントスレッド(シングルスレッドアパートメントスレッド)はスレッドモデルです。その他には、MTA(マルチスレッドアパートメント)とフリースレッド(フリースレッド)があります。
STAスレッドユニットの動作モードはdao(Object-per-Client)モードと呼ばれます。これは、STAスレッドユニットが独自のスレッドを持つように作成されることを意味します。どのユニットにもスレッドは1つしか存在できません。STAスレッドモードでは、スレッドへのすべての呼び出しがキューに入れられ、これらの呼び出しが1つずつ処理されます。したがって、STAスレッドが複数のメソッドを同時に実行することはありません。STAスレッドには独自のデータがあり、
スレッド間でデータを共有しません。この機能により、このスレッドモードは非常に安全になり、データの破損や同期の問題が回避されます。
STAとMTAスレッドユニットの最大の違いは、同じユニット内で、MTAユニットが複数のスレッドを同時に実行し、使用可能なすべての共有データを使用できることです。

同じニーズを持つ友達に役立つことを願っています

おすすめ

転載: blog.csdn.net/weixin_44693109/article/details/108464420