問題タブ [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.
c# - STAThread とマルチスレッド
STAThread に関する MSDN の記事から:
アプリケーションの COM スレッド モデルがシングル スレッド アパートメント (STA) であることを示します。
(参考までに記事全文です。)
シングルスレッドのアパートメント... OK、それは私の頭を通り過ぎました。また、アプリケーションが COM 相互運用機能を使用しない限り、この属性は実際には何もしないことをどこかで読みました。では、それは正確には何をし、マルチスレッド アプリケーションにどのように影響するのでしょうか? マルチスレッド アプリケーション (スレッドTimer
プールなどだけでなく、s を使用するすべての人から非同期メソッド呼び出しまでを含む) は、「安全のため」であっても MTAThread を使用する必要がありますか? STAThread と MTAThread は実際に何をしますか?
c# - Windows フォームを使用した WPF - STAThread
私は WPF の初心者で、WPF と Windows フォームの統合についていくつか質問があります。
既存の Visual C# Windows フォーム アプリケーションがあります。ボタンクリックで表示できるWPFウィンドウと統合したいと思います。WPF は呼び出しスレッドが STAThread であると想定し、デフォルトで WinForm はスレッドが MTAThread であると想定するため、これは不可能でした。WPF UI を呼び出すために STAThread のアパートメント状態で新しいスレッドを生成しようとしましたが、うまくいきませんでした。Dispatcher.BeginInvoke メソッドと Background Worker も使用してみましたが、どれも問題を解決しませんでした。
1) メインを STAThread としてマークせずに WPF ウィンドウ/コントロールを呼び出すことはできますか? 可能であれば、誰かが私を適切な方向に向けることができますか? 2) これを達成する唯一の方法がメインスレッドを STAThread にすることである場合、アプリケーションの一般的なパフォーマンス/応答性に何らかの影響がありますか?
前もって感謝します。
c# - 同じコンポーネントの 2 つの COM STA インスタンスを持つことは可能ですか?
ここの別のスレッドで問題が発見されました。STA である COM コンポーネントにアクセスする必要があります。デュアルコア コンピューターで実行します。このコンポーネントを使用するプロセスは、CPU の 50% にしか達しません。残念ながら、所有者はコンポーネントを MTA に変更できないと述べています。これは、コンポーネントが C をコアとする Matlab でコンパイルされたハイブリッド システムであるためです。
そのため、COM クラスの 2 つのインスタンスを同じプロセスにロードしようとしましたが、異なるスレッドがアクセスしていましたが、最後の COM インスタンスだけが使用可能になりました。この問題を解決できる何かを知っていますか?
100% cpu を達成するために、同じコンピューターでサービスの 2 つのプロセスを実行することを検討しています。これは、主にこのサーバーがインフラストラクチャの外部にインストールされるため、良い解決策ではありません.
wpf - IoC とユーザー インターフェイス
依存性注入のためにアプリケーション内で IoC を使用する最善の方法について頭を悩ませようとしていますが、少し問題があります。
WPF アプリで MVP パターンの緩やかな実装を使用しています。基本的に、プレゼンター クラスがインスタンス化され、ビューとタスク (EmployeePresenter の IEmployeeView と IEmployeeTask など) がプレゼンターに挿入されます。
これらのインスタンスを手動で注入する代わりに、IoC コンテナーを使用したいと思います (Unity を試していますが、これは ninject や Structure Map などの他のものでも発生すると思います)。 IoC コンテナー) を非同期デリゲート呼び出し、またはイベント スレッド (例: STA スレッドではない) で呼び出してから、WPF ウィンドウの新しいインスタンスを作成すると、次の例外がスローされます。
現在のビルド操作 (ビルド キー Build Key[ namespace .Window1, null]) が失敗しました: 多くの UI コンポーネントがこれを必要とするため、呼び出しスレッドは STA でなければなりません。
さて、新しいウィンドウ インスタンスなどを STA にする必要があることはわかっていますが、UI を STA スレッドで作成する必要がある場合でも、IoC コンテナーを使用して依存関係の挿入を行うことは可能ですか?
この問題を見ると、解決されているクラス/タイプは、登録時ではなく、解決時にインスタンス化されているように見えます...
.net - Visual C++ GUI アプリが MTA モードでスタックする
奇妙な動作を示す C++ GUI プロジェクトがあります。私のマシンでは、コードは問題なくコンパイルおよび実行されます。ただし、別のマシンでは、コードはコンパイルされますが、何らかの形で MTA で実行されます。明らかに、MTA を使用すると、GUI にあらゆる種類の実行時の問題が発生します。これが私のメインです:
メインの最初の行にブレークポイントを配置してアパートメントの状態を確認できます。正しくビルド/実行されるマシンでは、予想どおり「STA」になります。ただし、問題のあるマシンでは「MTA」になります。アパートメント モードを STA に切り替えても効果はありません。
デバッグ/リリースディレクトリを削除して、コンパイルする前にプロジェクトをクリーンアップしようとしましたが、デバッガーを接続せずに実行しましたが、すべて役に立ちませんでした。どのマシンが動作し、どのマシンが動作しないかのパターンを特定できません。実行中のマシンで exe をコンパイルし、問題のあるマシンに実行すると、正しく実行されるため、ビルド環境の問題であると思われます。関連するすべてのマシンは、Visual Studio 2008 標準で Windows XP を実行しています。何か案は?
multithreading - STA スレッドで実行中に、この COM 相互運用イベントが発生しないのはなぜですか?
以下のコードで STA スレッドを使用しているときに「OnNewMail」イベントが発生しない理由を誰か説明してもらえますか? このプログラムは、Redemption ライブラリを使用して、受信した Outlook メールを傍受しようとします。
wcf - COM の MTA ではなく STA として REST/WCF を実行する
MTAの代わりにSTAとして実行するようにREST (WCF) サービスを構成することはできますか?
これは、従来の COM オブジェクトを実行するために必要なアプローチです。ASMX Web サービスを MTA ではなく STA として実行するように構成するには、HTTPHandler を使用して Web サービスを強制的に STA として実行する回避策を利用できます。
Jeff Prosise による記事 ( http://msdn.microsoft.com/en-us/magazine/cc163544.aspx ) では、回避策とその適用方法について詳しく説明しています。同じ HTTPHandler を REST ベースの WCF サービスに適用すると ( Visual Studio で [ Create New ADO.NET Data Service ] を使用)、WebServiceHandlerFactory が呼び出された時点でエラーが発生します (HTTPContext、URL などが渡されます)。
ハンドラーは ASMX Web サービスに対して機能し、スレッド モデルを STA として返す WebMethod を追加できます。ただし、ASPCompatibility を (web.config
クラス レベルでもクラス レベルでも) 設定した後でも、REST サービスを使用しようとすると、カスタム HTTPHandler は常に同じポイントでエラーを生成します。いくつかの「サービス オペレーター」メソッドで基本的な REST サービスを使用しているため、エンドポイントは構成していません。エラーは次のとおりです。
タイプ 'System.Web.Compilation.BuildResultCustomString' のオブジェクトをタイプ 'System.Web.Compilation.BuildResultCompiledType' にキャストできません。
.net - STA、MTA、OLEの悪夢
.NETアプリケーションをプラグインとして別の.NETアプリケーションに含める必要があります。プラグインインターフェイスでは、テンプレートフォームから継承する必要があります。プラグインがロードされると、フォームはMDIに添付されます。
これまでのところすべてが機能していますが、ドラッグアンドドロップイベントに登録するたびに、コンボボックスのオートコンプリートモードを設定するか、その他のさまざまな状況で次の例外が発生します。
... OLE呼び出しを行う前に、現在のスレッドをシングルスレッドアパートメント(STA)モードに設定する必要があります。Main関数にSTAThreadAttributeがマークされていることを確認してください...
メインアプリケーションはMTAで実行されており、他社によって開発されているため、私にできることは何もありません。
STAスレッドでこれらの例外を引き起こすことを試みましたが、それでも問題は解決しませんでした。
誰かが同じ状況にありましたか?問題を解決するために私にできることはありますか?
f# - F#の非同期ワークフローとしてのSTATHREAD
次のコードフラグメントについて考えてみます。
windowsProcessにSTATHREADが必要な場合はどうすればよいですか?この構造でこれは可能ですか?
com - フッキングスレッド出口
管理対象スレッドの終了をフックする方法はありますか(つまり、スレッドが終了する直前に、スレッドでコードを実行しますか?)
一部のスレッドで機能するスレッド出口をフックするメカニズムを開発しました。ステップ1:コールバック関数を受け取り、それをデストラクタで呼び出す「フック」STACOMクラスを開発します。手順2:フックするスレッドにこのオブジェクトのThreadStaticインスタンスを作成し、管理対象のデリゲートが管理対象外の関数ポインターに変換されたオブジェクトを渡します。次に、デリゲートはスレッド出口で呼び出されます(CLRがスレッド出口の一部としてすべてのSTACOMRCWでIUnknown::Releaseを呼び出すため)。
このメカニズムは、たとえば、Threadクラスを使用してコードで作成したワーカースレッドで機能します。
ただし、アプリケーションのメインスレッド(コンソールまたはWindowsアプリ)では機能しないようです。「フック」COMオブジェクトは、シャットダウンプロセスの後半で削除されたようで、デリゲートを呼び出そうとして失敗します。
(この機能を実装する理由は、スレッド上で作成されたSTA COMオブジェクトを処理する既存のスレッドで、「遅すぎる」前(つまり、スレッドが終了する前、およびスレッドが終了する前)にネイティブCOMコードを実行できるようにするためです。そのスレッドでSTACOMオブジェクトを操作することはできなくなりました。))