問題タブ [sta]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - STA スレッド モード スレッドも winform UI スレッドをブロックしますか?
バック グラウンド スレッドから STA COM オブジェクトを使用しています。COM オブジェクトのモードが STA であるため、STA スレッド モードの新しいスレッドから呼び出すと、COM オブジェクトのメソッドの 1 つがブロックされ、UI スレッドのようです。もブロックされます。この UI のブロックを回避できますか?
c# - 外部プロセスからのC#でのスレッドの問題
私はこの単純なコードを持っています:
残念ながら、このコードを(サードパーティのプロセスから)実行すると、スレッドは実際には実行されません。プロセスエクスプローラーとVSデバッガーのどちらでも、スレッドが作成され、その状態が「実行中」であることがわかります。
メインスレッドのアパートメントはSTAであり、内部スレッドでSTAとMTAの両方を試しました。
Run()
最後にメソッドに追加するとinvokerThread.Join();
、スレッドは実行されます。しかし、それでも実際には役に立ちません。
私は何が欠けていますか?
編集:ここにコードホスティングに関するいくつかの詳細情報があります-
Run()
メソッドは、実行可能アセンブリも管理されているプロセスからCOM相互運用機能を介して呼び出されます(COM相互運用機能が使用される理由は、システム内の他のすべてのコンポーネントがネイティブであるためです)。
このメソッドRunOnBackground()
には、トレース後にさらにいくつかのコードが含まれ、通常、別のプロセスの開始と終了の待機を含め、その実行は10〜20秒続きます。また、トレースにデバッグ情報を書き込む他の領域がコードにあります。コードのデバッグ中はRun()
、通常どおりに実行され、invokerThread.Start();
invokerThreadの状態が「実行中」になった後(RunOnBackground()
メソッド内のブレークポイントは停止しません)。
invokerThread.Join()
メソッドの最後に追加するとRun()
、デバッガーは。のRunOnBackground()
後に移動しJoin()
ます。
asp.net - STA スレッドによってデリゲートを呼び出すための一般的な「FuncSTA」はありますか?
ASP.NET
アプリケーションがあり、そのCOM
中でいくつかのコンポーネントを使用する必要があります。
Func
またはAction
、新しいSTA
スレッドを作成し、そのスレッドまたはこのようなものでデリゲートを実行するラッパークラスが必要です。そのようなクラスやライブラリ、またはサンプルコードを知っていますか?
c# - 1 つのプロセス内で共存できる 'STA' スレッドの数はいくつですか?
一部のコンポーネントSTA
を使用するには、ASP.NET アプリケーション内で複数のスレッドが必要です。COM
各プロセス内のどこかを読みましたが、STA
存在できるスレッドは1つだけです。サンプル プロジェクトをコーディングし、多くのスレッドを作成し、それらのアパートメントの状態を に設定するSTA
と、COM
例外なくオブジェクトを操作できます。
プロセス内に多くのSTA
スレッドを持つことは可能ですか?
c# - `STA`スレッドでデリゲートを実行するようにスレッドプールに指示するにはどうすればよいですか?
プロジェクトCOM
内のオブジェクトを操作するためのスレッドプールが必要です。ASP.NET
c# - MTAスレッドと比較したSTAスレッドの制限は何ですか?
このようにスレッドSTAを作成すると、属性Thread.SetApartmentState(STA);
でマークされたコードを実行できなくなります。[MTAThread]
[STAThread]
Windowsやコンソールアプリケーションで見たことがありますが、属性を持つコードを見たことがなく[MTAThread]
、どの.NETライブラリがこの属性を使用しているかわかりません。
私の質問は、MTAアパートメント状態のスレッド(自然な.NETスレッド)と比較して、アパートメント状態がSTAに設定されているスレッドの制限は何ですか?
c# - WinForms アプリケーションがデフォルトで STAThread になっているのはなぜですか?
Visual Studio で空のWinFormsSTAThread
アプリケーションを作成すると、テンプレートのメイン アプリケーション クラスに属性が含まれます。
私はそれについていくつかのドキュメントを読んでいますが、それをまったく理解しているかどうかはわかりません.
本当に私はそれについていくつか質問があります:
- なぜこの属性が追加されたのですか?
- どういう意味ですか?
- この属性を削除するとどうなりますか?
c# - バックグラウンド ワーカー スレッドをシングル スレッド アパートメントに設定するにはどうすればよいですか?
自動テスト実行アプリケーションを作成しています。アプリケーションのこの部分では、ポーリング サーバーで作業しています。Web サーバーを常にポーリングして、新しい自動テストをいつ実行する必要があるかを判断します (GUI アプリケーションの夜間の自動実行用)。
ポーリング サーバーが要求を確認すると、必要なすべての情報をダウンロードし、バックグラウンド ワーカーでテスト実行を実行します。Clipboard.Clear()
問題は、テスト実行の一部に、バックグラウンド ワーカー スレッドで発生するOLE、COM、およびその他の呼び出し (たとえば、 ) があることです。これらの呼び出しのいずれかが発生すると、次の例外が発生します。
OLE 呼び出しを行う前に、現在のスレッドをシングル スレッド アパートメント (STA) モードに設定する必要があります。Main 関数に STAThreadAttribute がマークされていることを確認します。
バックグラウンドワーカースレッドをシングルスレッドアパートメントとしてマークするにはどうすればよいですか? 私の Program.cs の Main 呼び出しには、明らかにその属性が既にあります。
c++-cli - STA、MTA 競合の警告 重要ですか?
最近、ネイティブ C++ ライブラリの C++/CLI ラッパーを書き始めました。このコンパイル警告が表示されるようになりました
"警告 LNK4249: ディレクティブ '/CLRTHREADATTRIBUTE:STA' はコマンド ラインと競合します。無視されます"
私の c++/cli ラッパーは、リンカのコマンド ライン引数で MTA 用に設定されていますが、STA ディレクティブを指定しようとしているファイルまたはプロジェクトがわかりません。
.NET が強制的にライブラリをマルチスレッド化することについて心配するほど、十分な読み物をしました。これは主にアプリケーションでの COM の使用に影響することを読みましたが、DLL が COM を使用しているかどうか、またはどこで COM を使用しているかはよくわかりません。相互運用サービスを使用して文字列データをマーシャリングし、'msclr\auto_gcroot.h' を使用してアンマネージド クラスからマネージド クラスをポイントしています。ラップされているネイティブ C++ ライブラリに、次のヘッダーを含めます。
将来のつらい経験を避けるのに役立つアドバイスはありますか、それとも心配する必要はありませんか?
.net - ASPXページのAspcompat
私のaspxページでは、STAを使用するCOMコンポーネントを呼び出します。したがって、aspcompat = trueパラメーターを使用しますが、ロジックを理解したいと思います。それは正確に何をしますか?私の知る限り、STAでは、1つのスレッドによってのみ呼び出されると想定されています。だから私は自分でスレッドセーフを提供する必要があります。
そうだとすれば、aspcompatパラメーターはどこでスレッドセーフを提供しますか?ページ全体、またはSTAコンポーネントにアクセスするポイントだけですか?