問題タブ [apartments]

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.

0 投票する
9 に答える
153613 参照

.net - STAとMTAについて教えてください。

STA と MTA についてご自身の言葉で説明していただけますか?

また、アパートメント スレッドとは何ですか。それは COM のみに関連するものですか? もしそうなら、なぜですか?

0 投票する
1 に答える
338 参照

multithreading - 「入力同期呼び出し」という用語は何を意味しますか?

マルチスレッド アパートメントに関する記事でこれを見つけましたが、「入力同期呼び出し」の定義が見つかりません。(記事はhttp://msdn.microsoft.com/en-us/library/ms693421(VS.85).aspxにあります)

記事で使用されているように - マルチスレッドアパートメントは入力同期呼び出しを行うことができません

「入力同期」呼び出しとは何ですか?

ありがとう

0 投票する
6 に答える
6877 参照

c# - WebBrowser.Navigated MessageBox.Show(); の場合にのみ起動します。

親スレッドは BackgroundWorker であり、他にもやるべきことがたくさんあるため、バックグラウンド STA スレッドから動的にインスタンス化されている WebBrowser コントロールがあります。

問題は、.Navigate() に指示したメソッドで MessageBox.Show() をポップしない限り、Navigated イベントが発生しないことです。私は説明します:

これは正常に機能します。ただし、これは自動化アプリであるため、メッセージ ボックスが邪魔になります。MessageBox.Show() を削除すると、WebBrowser.Navigated イベントが発生しません。この行を Thread.Sleep() に置き換え、親スレッドを中断してみました。

これを片付けたら、WebBrowser がその仕事をしている間に親スレッドを一時停止し、結果の HTML を親スレッドに戻す何らかの方法を見つけて、さらにロジックを続行できるようにします。

なぜこれを行うのですか?どうすれば修正できますか?

POST動詞もQueryString を介してデータを渡す場合、この演習全体が不要になるため、その答えも受け入れます。


解決策:チームアーキテクトの提案で、BackgroundWorkerとスレーブスレッドをまったく使用しないことになりました...応答性を犠牲にしていますが:(

0 投票する
5 に答える
49600 参照

c# - シングルスレッド アパートメント vs マルチスレッド アパートメント

重複の可能性:
STA と MTA について説明していただけますか?

すべての ThreadPool スレッドはマルチスレッド アパートメントにあります。

--MSDNによると

どういう意味ですか?マルチ スレッド アパートメント モデルとシングル スレッド アパートメント モデルの違いに本当に関心があります。または、アパートのモデルはどういう意味ですか?MSDN を読みましたが、意味がわかりません。アイデアはあると思いますが、ここにいる誰かが簡単な英語で説明できると思っていました.

ありがとう、アンソニー・D

更新 1

これを見つけました STA と MTA について説明していただけますか?

誰でももっと説明できますか?

更新 2

また、これがスレッドプールにどのように適用されるか、およびこのために何に注意する必要があるかについての回答も探しています。

0 投票する
2 に答える
1924 参照

multithreading - ネイティブの Win32 DLL を呼び出す従来の VB6 COM+ DLL -- STA のスレッド化の問題?

一見 MT の問題のように見えるものに出くわしますが、COM+ で使用される STA モデルを詳細に理解しようとしています。

事実上、VB6 で記述された従来の COM+ コンポーネントがあり、C++ で記述されたネイティブ (つまり、COM ではない) Win32 DLL を呼び出します。

断続的な (そしてテストでは再現不可能な) 問題が発生したため、デバッグ コードを追加して何が起こっているのかを調べたところ、問題が発生したときにログ メッセージがファイルにインターリーブされていることがわかりました。つまり、DLL が2 つのスレッドから同時に呼び出されていました。

_getpid() と GetCurrentThreadId() に基づいてスレッドごとのファイルにログが記録されるようになったため、C++ DLL のコードが呼び出されると、同じスレッドで同時に 2 回呼び出されているように見えます。STA についての私の理解では、COM がオブジェクトの個々のインスタンスを単一のスレッドにマーシャリングし、実行を自由に中断および再開するため、これが当てはまる可能性があることが示唆されています。

残念ながら、ここからどこへ行くべきかわかりません。DllMain() で CoInitialiseEx() を呼び出して、これが STA DLL であることを COM に通知する必要があることを読んでいますが、他の場所では、これは COM DLL に対してのみ有効であり、ネイティブ DLL では効果がないと言っています。他の唯一のオプションは、DLL の一部をクリティカル セクションとしてラップして、アクセスをシリアル化することです (あごにかかるパフォーマンス ヒットはすべて受け入れます)。

DLL を作り直すことはできますが、共有状態やグローバル変数はありません。すべてがローカル変数にあるため、理論的には各呼び出しが独自のスタックを取得する必要がありますが、STA モデルが基本的にこれに奇妙な影響を与えているのではないかと考えています。別の呼び出しと同じエントリ ポイントで、既に読み込まれている DLL に再入力するだけです。残念ながら、この理論を証明またはテストする方法がわかりません。

質問は基本的に次のとおりです。

  1. STA COM+ コンポーネントがネイティブ DLL を呼び出すとき、アクティブな「スレッド」が中断され、DLL 呼び出しの途中で制御が別の「スレッド」に渡​​されるのを防ぐための STA モデルはありませんか?
  2. CoInitialiseEx() はこれを解決する正しい方法ですか?
  3. (1) も (2) も「良い」仮定ではない場合、何が起こっているのでしょうか?
0 投票する
1 に答える
1596 参照

c# - シングルスレッドのアパートメントで実行する Quartz.net ジョブを作成する方法は?

私は単にこれを試しました:

ただし、InvalidOperationException が生成されます。アイデア?

0 投票する
1 に答える
470 参照

asp.net - 共有ホスティング環境での Thread.Join

誰かが私を助けることができるかどうか疑問に思います - 私は長い間 VB.Net をプログラミングしてきましたが、ASP.Net で多くのスレッドを実行する必要はめったにありませんでした。

インメモリ ブラウザを使用して Web サイトの「スクリーンショット」を取得しようとしています。これらのイメージは DB に記録され、ローカル ファイル システムに書き込まれます。

ローカルサーバーで実行すると、すべて正常に動作します。共有ホスティング環境で実行すると、thread.join を実行するまでは問題ありません。その時点で、ターゲット スレッドがすぐに終了するかスタックします (どちらのスレッドからもログ情報が受信されません)。以下にログを添付しました

重要なコードも添付されていますが、要するに次のとおりです。

各 URL に対して、新しいスレッドを開始し、それに thread.join します。新しいスレッドがブラウザをロードし、ナビゲーションを開始します。生成されたビットマップ画像を返す前に、ブラウザのロードが完了するまでヌープします (次のステップ)。

ブラウザーの読み込みが完了すると、イベントが発生します。ハンドラーは、ブラウザーからビットマップ イメージをキャプチャし、ローカルに書き込みます。

いくつかのグーグル検索を行ったが、多くの関連情報を見つけることができない - 一般的な共有ホスティングの問題を発見し、それらをカバーしていることを確認した (例えば、部分的に信頼された呼び出し元を許可する、アセンブリに署名するなど...)

このトピックに関する知識を持っている人が親切に私を正しい方向に向けてくれれば幸いです.

どうもありがとう

注意: 画像を順次処理しているため、現時点では非常に遅くなることは承知していますが、1 つのスレッドで動作するようになるまでは、複数のスレッドで動作する可能性はありません。

これは大部分がコード サンプルからまとめられたものであり、私はそれを整理/整理することさえ始めていないので、少し乱雑なコードをお詫びします。

そして私が見るログエントリ:

0 投票する
1 に答える
307 参照

.net - STAモデルの.NETライブラリコンポーネントを駆動するTimerCallbackデリゲート

TimerCallback Delegateメカニズムを使用して、サードパーティの.NETライブラリコンポーネントからオブジェクトのインスタンスを、時間ベースで実行される個別のスレッドで駆動しようとしています。

ライブラリからオブジェクトのインスタンスを作成しようとすると、例外が発生します。

(オブジェクト名)はシングルスレッドアパートメント(STA)からのみ呼び出すことができます

私のアプリケーションのエントリポイントであるサブメインは、msdnのMicrosoftの例のようにMTAThreadとマークされています。

0 投票する
1 に答える
2382 参照

multithreading - アパートメント スレッド モデルについて

アパートについていくつか質問があります。

  1. このモデルは COM のみを目的として導入されたものですか?
  2. それらに関する優れたリソースを教えてください。
  3. スレッド セーフの観点から、コンポーネントが STA または MTA モデルをサポートするとはどういう意味ですか?

ありがとう。