問題タブ [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.

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

.net - この場合、STA メッセージループは必要ですか?

.NET アプリケーションのスレッドで作成および実行している COM オブジェクトがいくつかあります。スレッドはシングル スレッド アパートメントとしてマークされており、すべてが機能しているようです。私の理解では、これらのスレッドがメイン スレッドから COM オブジェクトにアクセスしようとすると、それらのオブジェクトは .NET で自動的にマーシャリングされ、シリアル化されます。少しゆっくり。

私の質問は、問題なく動作しているように見えますが、作成中の STA スレッドでメッセージ ループをポンピングしていないということです。メッセージ ループを回避したいのは、それが引き起こす余分な複雑さ (および効率の低下の可能性) のためです。

なぜメッセージ ループが必要なのかについてのアドバイスをたくさん読みました (主に非常に役立つ Hans Passant から)。私の理解では、メッセージ ループはスレッド A に、他のスレッド B がその COM オブジェクトを要求できる場所を提供します。スレッド A に住んでいると、マーシャリングして遊ぶことができます。それが正しければ、他のスレッドがスレッド A の COM オブジェクトから何も要求しない限り、スレッド A はメッセージ ループをポンピングしないことで安全でしょうか? または、メッセージ ループが発生する可能性がある他のケースはありますか?

ここで火遊びですか?また、火遊びをしているのか、そうでないのかと尋ねることはありますか?

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

c# - STAThread 属性が無視されるのはなぜですか?

対奇妙な行動…

vs奇妙な行動

こんにちは、みんな!

誰か説明してくれませんか?

ありがとう、アレックス。

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

c# - 多くの UI コンポーネントがこの WPF を必要とするため、呼び出しスレッドは STA でなければなりません。

WPF Toolkitが提供する MessageBox を使用しています。そして、私はエラーが発生します

多くの UI コンポーネントがこれを必要とするため、呼び出しスレッドは STA でなければなりません。

この場合、ApartmentState を設定するにはどうすればよいですか

編集:WPF Toolkit の MessageBox コントロールを使用してモードレス MessageBox を表示しようとしています。これまでのところ、私が持っているコードは次のとおりです。

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

c# - オブジェクトを STA スレッドで使用した後、どのように使用できますか?

ハードウェアから情報を読み取る VSTO を使用して Microsft PowerPoint アドイン ソリューションを実行しています。ハードウェア開発者は、このハードウェアを制御するための SDK を提供してくれましたが、制御しようとすると問題が発生します。

私はこのライブラリを持っています ARS

クラスがあります ARS.BaseConnection

私はこの変数を持っています ARS.BaseConnection BaseConn;

問題は、タイプの新しいオブジェクトを作成するときですBaseConnection

デバッガーには例外は表示されず、POWERPNT.exe がクラッシュして停止するだけです。

POWERPNT をデバッグしようとしましたが、アクセス違反の書き込み場所 0x00d20f78 と表示されます。しかし、私は PowerPoint をプログラミングしていません。

SDK のデモ プログラム (実際に動作する) には main の前に [STAThread] があることがわかったので、STA として実行する必要があると思うので、新しいスレッドを作成します。

基になる RCW から分離されたCOM オブジェクトを使用できません。

どうすればこれを機能させることができますか?

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

c# - C#でSTAThreadを開始する

私はまだC#、特にC#でのスレッド化に少し慣れていません。シングルスレッドアパートメント(STAThread)を必要とする関数を開始しようとしています

しかし、次のコードをコンパイルすることはできません。

関数は、次のように呼ばれる別のクラスで次のようになりますMyClass

関数の上に属性[STAThread]を試しましたが、機能しません。

だから私は次のように新しいスレッドを作成しようとしています:

しかし、これはコンパイルされません(最適なオーバーロードされたメソッドには無効な引数エラーがあります)。ただし、オンラインの例は非常に似ています(ここの例)。 何が間違っているのでしょうか。また、新しいSTAスレッドで関数を実行するにはどうすればよいですか。

ありがとう

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

c# - BackgroundWorker の理解内で STAThread 内を移動する WebBrowser

私はすでに問題を解決していたので、良いタイトルを見つけるのに苦労していました. どうやって解決したのか説明が必要なだけです...今日発見したばかりのものに飛び込んでいるので、今ははっきりしないかもしれません。

したがって、ここで問題の解決を再開するために、私が問題を解決した方法と、私が理解していないことを示します。

データを取得するために Web サイトにクロールする WindowsForm アプリケーションを設計しています。クロールするいくつかの異なる Web サイトがあり、それぞれが異なります。私が使用する基本的な方法は、WebRequest を使用することです。ただし、ある Web サイトではクリックをシミュレートする必要があるため、この特定の Web サイトでは、WebBrowser コントロールを使用して特定の JavaScript 関数を呼び出します。

クロール作業は本当に時間がかかり、アプリケーションがフリーズしたため、メイン スレッドから抜け出すことにしました。

私がこれを行っていた方法は、検索メソッドごとの BackgroundWorker (Web サイトごとに 1 つ) でした。WebBrowser を使用したものを除くすべての Web サイトでうまく機能しました。「'WebBrowser' コントロールのウィンドウ ハンドルを取得できません。ウィンドウのない ActiveX コントロールはサポートされていません。」という例外が発生しました。

WebBrowser が構築されたスレッドにいなかったため、WebBrowser コントロールを使用できないことが Web でわかりました。元の Form ではなく、BackgroundWorker の DoWork メソッド内に WebBrowser をラップする Form を作成し、この WebBrowser に対して Navigate() メソッドを呼び出すことにしました。

同じ例外を除いて、どちらも機能しませんでした。私はこの回答(http://stackoverflow.com/questions/4269800/webbrowser-control-in-a-new-thread)を見つけました。これは私を大いに助けてくれました(コードの回答部分を少し変更して、質問中心でした)

だから今:

ボタンをクリックすると、BackgroundWorker が作成されます。BackgroundWorker 内で、launchSearch メソッドが呼び出されます。この launchSearch メソッド内で、必要なすべての作業を実行する新しいスレッドを作成し (このスレッドは、上記でリンクしたソリューションとほとんど同じ方法で作成されています)、「hasActiveThread」ブール値を true に設定します。スレッドは作業を終了していません。作業が終了したら、結果を取得して BackgroundWorker を解放します。

私を悩ませているのは、URLに移動しようとしたときに、BackgroundWorkerの「DoWork」メソッド内でフォームを作成すると正しく機能しなかった理由がよくわからないことです。少なくとも、解決策が「複雑」でなければならない理由と、その背後にある理由を理解するのを手伝っていただければ、本当に感謝しています!

Al_th

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

wpf - BackgroundWorkerで新しいユーザーコントロールを作成すると失敗します

gif を読み込んで同時にユーザーコントロールを読み込もうとするたびにプログラムが遅れるため、マルチスレッドが必要なため、Google を見回しました。むしろ、GIF がハングし、ページに遷移なしで突然ユーザー コントロールが表示されます。プログラムがどのように動作するか、

GIF を表示 -> ユーザーコントロールをロード -> Gif を非表示 -> アニメーションを実行 (単純なスライドが有効)

しかし、ユーザー コントロールの ui 要素をレンダリングするときの遅延のため、プログラムは次のように動作します。

Gif を表示 -->Gif がハング (またはフリーズ) --> ユーザー コントロールをすぐに表示

だから私は BackgroundWorker と呼ばれるものを見つけました。いいね 。まあ...完全ではありません。私はそれを試して、私のコードに適用しました

いいですね。実行しました。失敗した。それは私にこのエラーを与えました

多くの UI コンポーネントがこれを必要とするため、呼び出しスレッドは STA でなければなりません。

そのため、オンラインで再度調査したところ、このクラスを使用してユーザーコントロールをロードするシナリオは見つかりませんでした。だから私は助けを求めてコミュニティに頼ります....助けますか?

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

c# - COM 相互運用機能を使用した WPF ビデオ レンダリング アプリケーションでの OutOfMemory 例外

社内の COM DLL と相互運用する WPF/C#.Net 4.0 を使用して開発されたリッチ クライアント アプリケーションがあります。通常のイベントは、ビデオ データを含むこの COM インターフェイスを介して発生します。

アプリケーションの一部として、Windows Media Foundation を介してビデオをレンダリングし、Window Media Foundation を使用するための相互運用機能を作成しました。同時に異なるビデオをレンダリングする複数の WMF パイプラインがあります。

アプリケーションは、ビデオのレンダリングに 6 ~ 8 時間実行されます。この間、プライベート バイトは一貫して安定しています (たとえば、約 500 ~ 600MB)。

ある時点で、アプリケーションがハングしたように見えます。この時点で、プロセスが約 1.4 GB のメモリを消費し、OutOfMemoryException でクラッシュするまで、プライベート バイトが急速に増加します。

異なるグラフィック カード (NVIDIA および ATI カード) を使用し、Windows 7 32 ビットと 64 ビットが混在する 5 つの異なるワークステーションでこれを再現しました。

3 つのダンプ ファイルを分析したところ、ファイナライザー スレッドが ole32.GetToSTA() メソッドの呼び出しを待機していることがわかりました。ファイナライザー スレッドがブロックされる原因と、これを解決する方法を特定できません。私たちが分析してきた 3 つのダンプからの抜粋を貼り付けました。

ダンプ 1)

スレッド 2:ae0 は STA スレッド efc で待機しています

スレッド 28:efc は WaitForSingleObject を呼び出しています。待機中のハンドルは、実際にはスレッド ID 14a4 のスレッド ハンドル 5ab4 です。

スレッド 130:14a4 には次のスタックがあります。

ダンプ2)

STA スレッド:

ファイナライザ スレッドが STA に切り替えようとしています:

ダンプ3)

ファイナライザ スレッドは GetToSTA 呼び出しにあるため、COM オブジェクトが解放されるのを待っています。

スレッド 29 は STA の COM オブジェクトであり、スレッド 53 (1bf4) が所有するクリティカル セクションで待機しています。

スレッド 53 は次のことを行っています。

この問題を解決する方法について何かアイデアはありますか?

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

wcf - AccessViolationException および Faulting モジュール: この例外の原因は何ですか? 障害のあるモジュールですか?

AccessViolationException が発生した場合、それに関連する障害のあるモジュールは、それがそのモジュールのバグであることを意味しますか? この場合、たまたまサードパーティの DLL の 1 つですか? それとも、これはもっと複雑な問題ですか?このモジュールのメーカーに連絡しましたが、バグは見つかっておらず、スタックの破損の可能性を示唆しているだけです。ただし、イベント ログによると、特定のエラー モジュールは常に AccessViolationException に関連付けられています。では、これについての真実は何ですか?バグのあるサードパーティの DLL モジュールですか、それとも何か他のものですか?

バックグラウンド

IIS 7 で実行されている .NET WCF Web サービスでミューテックスで保護された VB6 STA COM オブジェクトを使用しています。最近、Web サービスを完全にクラッシュさせるランダムな System.AccessViolationException エラー (このオブジェクトが原因) を検出しました。現時点では、この COM オブジェクトを Web サービスで動作させるためにあらゆることを行っています。サービス自体は、次のガイドを使用して STA モードで実行するように設定されています。

ありがとう

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

wpf - wpfのSTAスレッド

ListViewItemに問題があります。スレッドで使用すると、次のメッセージが表示されます。

「多くのUIコンポーネントがこれを必要とするため、呼び出しスレッドはSTAである必要があります。」

それから私はそれをに変更します:

私がそれを使うとき、それは再びメッセージを表示しますが:

「別のスレッドがオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。」

ディスパッチャーを使用しています。再びメッセージが表示されます。

「別のスレッドがオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。」

問題を解決するために私は何をしていますか?