問題タブ [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.
wpf - wpfスレッド、スレッドはSTAである必要があります
ページを含むフレームのあるウィンドウ(メインウィンドウなど)があります。ページ上のボタンは別のウィンドウ(ポップアップウィンドウなど)を開きます。今、私はポップアップウィンドウのボタンからメインウィンドウのメソッドを呼び出そうとしています。メソッドはマルチスレッドである必要があります。Windowsフォームで同様のソリューションを実行していましたが、多くのUIコンポーネントがWPFでこれを必要とするため、呼び出し元のスレッドはSTAである必要があります。
ポップアップウィンドウをモーダルに開くページのメソッド
ここでwindow1はメインウィンドウです。doneDealメソッドは
最後に、私がバックグラウンドで実行しようとしているメソッド
また、ticksメソッドの結果からグリッドビューにデータを入力したいのですが、これはバックグラウンドでループして何度も実行されますが、グリッドに追加するデータを定期的に返します。進行状況の更新イベントでそれを行う必要がありますか?wpfでディスパッチャーとバックグラウンドワーカーの周りに頭を包むために多くのことを試みましたが、STAアパートの状態ビットを理解できていません。誰かが私のティックメソッドを実行するのを手伝ってくれるか、正しい方向に私を向けることができれば、私は非常に感謝しています。
backgroundworker - 別のスレッドで作成された新しいフォームの親としてメイン フォームを使用する
BackgroundWorker スレッドを実行するメイン フォームがあります。ワーカーが実行されている間、メイン フォームを「フリーズ」し、進行状況を表示しながら終了するのを待ちます。
シナリオの 1 つでは、ワーカーはユーザーがファイルを選択できるように OpenFileDialog を表示できます。3 番目のスレッドを使用して OpenFileDialog を実行し、ApartmentState を STA に設定します。これは、OpenFileDialog がそれを要求し (実行しないと例外がスローされます)、ワーカーの ApartmentState が MTA であるためです。
問題は、OpenFileDialog.ShowDialog を呼び出すときに使用できるように、メイン フォームをパラメータとして OpenFileDialog スレッドに渡したいことです。このようなもの:
もちろん、ShowDialog は次をスローします。
クロススレッド操作が無効です: コントロール 'Form' は、それが作成されたスレッド以外のスレッドからアクセスされました。
スレッドセーフな方法でこれを行うにはどうすればよいですか?
これの目的は、OpenFileDialog が STA スレッドで実行され、メイン フォームがその上に表示されないようにすることです (ユーザーが下のフォームをクリックするのをブロックして、OpenFileDialog を非表示にします)。
ありがとう
asp.net - [STAOperationBehavior] 属性を使用して WCF サービスでユーザー情報を取得する
Silverlight対応の WCF サービスがありますが、そのうちの 1 つのメソッドには [STAOperationBehavior] 属性が絶対に必要です。ユーザーのユーザー詳細 (フォーム認証) にアクセスする必要がありますが、[STAOperationBehavior] 属性が適用されている間、Membership.GetUser() は失敗します。
すなわち
しかし
このメソッドでユーザー情報にアクセスするにはどうすればよいですか? または、このメソッドにユーザーの情報を提供するにはどうすればよいですか?
multithreading - MicrosoftのAparmentアナロジー(STA、MTA):それを理解するのに助けが必要
Microsoftのスレッド化されたアパートモデルについてたくさん読んだことがありますが、それを視覚化するのにまだ少し問題があります。
マイクロソフトは、アパートに住む生き物の例えを使用しています。したがって、STAの場合は、次のことを考慮してください(少しばかげていることはわかっています)。
スレッド=人、COMObject=バクテリアと仮定します。人はアパートに住んでいて、バクテリアは人の中に住んでいます。したがって、STA-Landでは、スレッドはSTAに存在し、COMObjectはスレッド内に存在するため、COMObjectと対話するには、COMObjectのスレッドでコードを実行する必要があります。
thread=personおよびCOMObject=catと仮定します。人はアパートに住んでいて、猫は人と一緒にアパートに住んでいます。STA-LandのSO、同じ階層レベルのスレッドとCOMObject。
Q1。上記のどのアナロジーが正しいですか、またはどちらも正しくない場合、STAをどのように説明しますか?
Q2。MTAをどのように説明しますか?
wpf - STA Thread または TaskScheduler.FromCurrentSynchronizationContext() を使用した並列プログラミング
WPF コントロールを使用して XPS ファイルを生成するコードを書いています。100ページのドキュメントとしましょう。ご存知のように、WPF UI 要素を使用しているため、STA スレッドである必要があります。フロント エンドには、100 ページの XPS ファイルを生成するクラス ライブラリ モジュールの GenerateBook メソッドを呼び出す Web サービスがあります。コードの次のセクションは、まったく問題なく動作しています。しかし、並列プログラミングを使用してより高速にしたいのです。そのため、以下のコードを使用してコードを変換しましたが、クアッド コア (4 CPU) マシンのパフォーマンスに影響はありませんでした。STA スレッドを並列に実行できないというのは本当ですか、それとも間違っていますか?
並列プログラミング後
どんな反応でも大歓迎です。
wcf - WCF サービスで STA Visual Basic 6.0 COM オブジェクトを呼び出すためのベスト プラクティス: 同時アクセス
STA Visual Basic 6.0 COM オブジェクトを呼び出す WCF サービスがあります。サービスを使用しているクライアントが 1 つだけの場合はすべて正常に機能しますが、同時ユーザーがサービスを呼び出し始めるとすぐに、COM オブジェクトのメソッドの 1 つを呼び出すときにあらゆる種類のランダム エラーが発生して困っています。
最初に、WCF 操作から STA COM オブジェクトを呼び出すという記事の助けを借りて、STAOperationBehavior 属性のサポートを追加することで、この問題を修正しました。
それは大いに役立ち、しばらくの間、すべてがうまく機能しているように見えましたが、複数のユーザーがサービスを呼び出しているときに、特定のサーバーで System.AccessViolationException エラーが発生し始めました。
これはおそらくスレッドの問題であり、Web サービスでミューテックスまたはインスタンス コンテキストを使用する必要があることを読みました。
同時ユーザーが WCF サービスで STA COM オブジェクトを問題なく使用できるようにするためのベスト プラクティスは何ですか?
c# - WebBrowser コントロールでのメモリ リーク オートメーション C# コンソール アプリケーション テスト
次の (この投稿の PS にある) テスト コードでは、メモリ リークが発生します。このメモリ リークの問題を解決する方法を教えてください。参考までに: 私は VS2010 Prof、.NET Framework 4.0、Win7 Ultimate、および IE9 を使用しています。テスト コードは、C# コード行を使用してアクティブ化できます。
ありがとうございました。
PS WebBrowser コントロール オートメーション C# コンソール アプリケーション テスト コード:
wpf - 「呼び出しスレッドは STA でなければなりません」の回避策
SOに関するこのトピックにはいくつかの回答があることは知っていますが、私のために働く解決策を得ることができません。データ テンプレート内から起動された ICommand から、新しいウィンドウを開こうとしています。新しいウィンドウがインスタンス化されると(「new MessageWindowP」内で) 、次の両方で前述のエラーが発生します。
TPL/FromCurrentSynchronizationContext Update の使用: 動作します
ThreadStart の使用: 更新: 推奨されません。Jon の回答を参照してください
ありがとう
編集。これまでの回答に基づいて、元のメソッドでコードを実行するだけでなく、現在のディスパッチャーで BeginInvoke も試したことを指摘したいと思います (それがコードの開始方法です)。下記参照:
BeginInvoke Update: 非推奨 Jon's answer を参照
同じスレッド で更新: 既に UI スレッドを使用している場合に機能します
BeginInvoke、最初/メイン ウィンドウ Update のディスパッチャへの参照を使用: 動作
GeneralManager.MainDispatcher は、最初に作成したウィンドウの Dispatcher への参照です。
私は途方に暮れています。
activex - スレッドがシングルスレッド アパートメントにあるため、ActiveX コントロールをインスタンス化できません。PC をスリープから復帰させた後に発生する
私は、通話の発着信時にブラウザー ウィンドウ (ExtendedWebBrowser) を開く VOIP クライアント (ウィンドウのフォーム) に取り組んでいます。通常は正常に動作しますが、コンピューターがスリープ モードになってから復帰すると、プログラムは次のエラーでクラッシュします。
コードで開始されたスレッドを設定しようとしましたthread.SetApartmentState(ApartmentState.STA)
が、同じ結果が得られます。[STAThread]
また、関数の前に持っていmain()
ます。今、コンピューターがスリープ状態になったときにスレッドが正しく終了しないことにもっと関係があるのではないかと思っていますが、よくわかりません。私のバックグラウンドは C++ と DirectX です。これは私が取り組んだ最初の Windows フォームなので、助けていただければ幸いです。
フォローアップ:プログラムを再開した後、メイン スレッドではなくワーカー スレッドで開始されていることを発見した後、この問題を解決することができました。詳細については、こちらを参照してください:スリープ (サスペンド) および Windows フォームの再開は、メイン スレッドではなくワーカー スレッドでプログラムを開始します。