問題タブ [threadstatic]

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 投票する
3 に答える
38081 参照

c# - ThreadStatic と ThreadLocal: ジェネリックは属性より優れていますか?

[ThreadStatic]ThreadLocal<T>ジェネリックを使用しながら、属性を使用して定義されます。なぜ異なる設計ソリューションが選ばれたのですか? この場合、属性よりもジェネリックを使用することの利点と欠点は何ですか?

0 投票する
0 に答える
369 参照

asp.net-mvc - リクエスト処理中にスレッド切り替えは可能ですか?

EF と単純な作業単位パターンの実装も使用する MVC アプリケーションがあります。これが私のUnitOfWork見た目です:

一般的なデータベース操作をカプセル化する汎用リポジトリがあります。

使用方法:

したがって、問題は、MVC フレームワークがリクエストの処理中にスレッドを内部的に切り替えることが可能かどうかです。現在UnitOfWorkはスレッドの静的であるため、このような切り替えはNullReferenceException呼び出し時に発生しUnitOfWork.Currentます (正しくない場合は修正してください)。

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

iis - Powershell を使用して特定のプロセス ID のスレッドを強制終了する方法

これは、オンとオフの数日間私を悩ませてきました。私は、Windows 2008R2 IIS サーバー上で実行されている、社内で作成された特注のサービスを多数持っているクライアント サイトにいます。問題は、これらのサービスのいくつかがハングアップし続け、「停止中」状態でスタックしていることです。これらのサービスを停止するには、プロセス エクスプローラーを開いてスレッドを強制終了するしかありません。「runas」の使用、ローカル管理者、またはサービス所有者としてのログオンなどについて誰かが何かを言う前に、私たちはそのすべてを経験してきました。

問題は実行可能ファイル自体にあります。別の国の開発チームがこれを検討する予定ですが、最低でも 4 ~ 5 か月かかります。

サービスが実行されていることを確認する機能を備えた定期的にサービスをチェックする Powershell スクリプトがあります。実行されていない場合は、サービスの停止と再起動を強制し、アクションを確認するために電子メールを送信します。ただし、言及されているこれらの特定のサービスでは、何もできません。タスクマネージャー、タスクキル、またはプロセスエクスプローラーでそれらを強制終了することはできません(スレッドを強制終了しない限り)、アクセスが拒否されたと表示されるだけです。プロセス エクスプローラーでアクセス許可を変更して強制終了することは可能ですが、スレッドを強制終了するよりも時間がかかります。

このサーバーには、別のフォルダーに同じ名前のexeを使用する2つのWebサイトがあるため、プロセス名を使用することはできません。私が求めているのは、私が持っているスクリプトを介して既に取得したプロセス ID のスレッドを見つけて強制終了する方法です。そのため、スクリプトの残りの部分は、上記のサービスを再起動するタスクを完了できます。現時点では、このサービスは昼夜を問わず一貫性のない状態で停止しており、サポート担当者はサーバーに RDP で接続し、プロセス エクスプローラーを開き、問題のあるプロセスを見つけてスレッドを強制終了し、サービスを再起動する必要があります。特に、powershell に自動的に実行させることができる場合、これらのすでに働きすぎている人にとっては、少し面倒です。

誰かがこれについて助けてくれることを願っています。前もって感謝します。

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

c# - 奇妙な「インデックスが範囲外でした」(マルチスレッドの問題)

C# (Visual Studio 2013) で Windows サービスを作成しています。サービスは、接続先のサーバーごとにスレッドをアクティブ化します。

「サーバー」オブジェクトは「ThreadStatic」として定義されています (したがって、各スレッドは別のオブジェクトとしてそれにアクセスする必要があります)。

デバッグ時-時々エラーが発生します:

次の行で発生します (「サーバー」スレッドのメソッド内)。

しかし、奇妙なことに、デバッガーは値が問題ないことを示しています。

したがって、エラーは発生しません!!!

F11 (デバッガー ステップ) を押すと、すべてが正常であるかのようにデバッグが続行され、割り当ても機能します...

どうして?????:0

現在のスレッドの値を割り当てる前にエラーが表示されるのは、Visual Studio のバグですか? それとも、私はスレッドセーフリーを使用していないのでしょうか (より可能性が高い)?

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

c# - C#で非同期待機モデル全体でスレッドコンテキストを維持する方法は?

ThreadStatic を使用し、await が「オプション」を完了するたびにコンテキストを設定していますか? 別の方法はありますか?

ThreadStatic を使用したくない場合、別の方法はありますか?

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

c# - スレッド静的、ASP.NET、および非同期ハンドラー

次のシナリオを検討してください。

  1. 非同期 .ashx ハンドラー
  2. 非同期 .asmx Web サービス メソッド
  3. 同期 MVC 5 コントローラー アクション メソッド

「論理」httpリクエスト中に一貫してアクセスできる「論理スレッド」固有のデータを設定する方法を見つけようとしています。つまり、非同期ハンドラーの「BeginExecute」部分のスレッドでデータが設定された場合ASP.NET が別の OS/.Net スレッドで「EndExecute」部分を実行したとしても、データはその asnc ハンドラの「EndExecute」部分で利用できると考えるでしょう。

さらに、2番目のリクエストが最初のhttpリクエストに以前に割り当てられたスレッドに割り当てられた場合、それがあったOS / .Netスレッドの「BeginExecute」部分のデータセットは、後続のhttpリクエストでは利用できないと予想しています。 「BeginExecute」部分にありましたが、最初の http 要求が非同期操作に入ったときにこのスレッドが解放されました (そして、まだ非同期操作を完了している可能性があります)。

.Netの「論理スレッド」または「論理スレッドコンテキスト」という言葉は、実際には、私が言及したのと同じ「論理」操作フローを意味すると思います(再割り当てされ続ける基礎となるOS / .Netスレッドではありません)。ワークフローの観点から見ると、各 http リクエストは新しい「論理」操作です (複数のユーザーが同じ Web サービスを順次または並行して呼び出したとしても、各リクエストは新しい個別の論理操作です)。つまり、「論理」操作は 1 回限りであり、繰り返すことはできません。ただし、同じ基礎となる OS/.Net スレッドは、可用性に基づいて到着したときに「論理」操作にマップできます。

さらに、このデータを HttpContext.Current の種類の静的プロパティとして公開したいと考えています。これは驚く人もいるかもしれませんが、非同期の .asmx Web サービス メソッドなどを使用している場合、HttpContext.Current は正しく機能しません。HttpContext.Current は常に正しい HttpContext を返す必要があるという Web 上のコンテンツを読んだことがあると確信していますが、.asmx Web メソッドの EndExecuteMethod では null として表示されています。私の最後の発言が正しいかどうかを誰かが確認できれば素晴らしいことですが、この発言は私がここで尋ねようとしている全体的な質問ではありません.

かなりの量の文献を読んだ後 (例: log4net.ThreadContext と log4net.LogicalThreadContext の違いは何ですか?http://msmvps.com/blogs/jon_skeet/archive/2010/11/08/the-importance-of-context -and-a-question-of-explicitness.aspxhttp://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.htmlなど、MSDN ドキュメントを含む)、ここに私の推論があります:

  1. ThreadStatic は、「論理」操作ではなく、基礎となる OS/.Net スレッドに対してローカルであるため、私の例では; 2 番目の http 要求が最初のスレッドの「BeginExecute」と同じスレッドに割り当てられた場合、「BeginExecute」の最初の http 要求で設定されたデータは、次の http 要求で表示されます。そして、このデータは、たまたま .Net によって別のスレッドに再割り当てされた場合 (ほとんどの場合に発生します)、"EndExecute" で使用できません。
  2. Thread.SetData は、私のユースケースではさらに問題があります。データ スロットを渡す必要があります。Thread.GetNamedDataSlot の戻り値からデータ スロットを渡す場合、アプリ ドメイン全体で情報を利用できます。名前付きデータスロットはスレッド間で共有されるため。
  3. CallContext.SetData は ThreadStatic に似ています (つまり、アプリ ドメインによって共有されませんが、異なる http 要求が同じ基になる OS/.Net スレッドに割り当てられると、同じデータが表示されます)。CallContext.SetData は、RPC 呼び出しのコンテキスト データをマーシャリングする追加機能を提供します。これは、現在尋ねられている質問には関係ありません。
  4. 次に、ThreadLocal クラス (.Net 4/.Net 4.5) があります。私の問題の一部を解決できたようです.BeingExecute操作のstateObject内にそれを渡し、endExecute操作の同じstateObjectパラメータから抽出できました。この観点から、ThreadLocal は .Net の非同期サポート用に作成されているようです。ただし、HttpContext.Current のようにアクセスする必要がある場合は機能しません。その「論理スレッドの静的」インスタンスを保持する方法がないためです (前の 3 つのポイントで何か間違ったことを言っていない限り)。
  5. そして最後に、CallContext.LogicalSetData が私が達成しようとしていることを実行しているようです。CallContext.LogicalSetData および CallContext.LogicalGetData メソッドのセットを使用して、「論理タスクの実行」に対して正しく機能する HttpContext.Current のような影響を達成できるはずです。

では、次の質問に移ります。

  1. 私が上で言ったことはすべて正しいですか。私が行ったすべての誤った主張を修正してください。
  2. 私が見逃した.Netのスレッドの静的な種類の機能に利用できる他のオプションはありますか?
  3. CallContext.LogicalSetData/LogicalGetData はコンテキスト データを RPC 呼び出しに渡しますか (msdn ページでは明確に言及されていません。http: //msdn.microsoft.com/en-us/library/system.runtime.remoting.messaging.callcontext.logicalsetdata (v=vs.110).aspx )。
  4. CallContext.LogicalSetData/LogicalGetData を使用することの欠点 (パフォーマンス上またはそれ以外) はありますか。
  5. このページでは、LogicalSetData のコピー オン ライト動作について説明しています: http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html。非同期ハンドラー/非同期 MVC 5 アクション メソッドのコンテキストでは、logicalsetdata を使用して参照型を保存し、後で参照型の状態を変更すると、どのような影響がありますか。再帰とは何ですか。
  6. Mutation/logicalsetdata/async については、オブジェクトを変更しても何が問題なのかまだわかりません。非同期メソッドが開始されると、copy-on-write 動作により、次に logicalsetdata が呼び出されたときにコンテキスト データのコピーがトリガーされます。これは浅いコピーであるため、参照オブジェクトは実際には 2 つの論理コンテキストで共有され、一方のコンテキストでの変更はもう一方のコンテキストで表示されます。これは通常、参照型に期待されることです。

多くの参考文献を含む長い質問ですが、うまくいけば、私は自分の研究をうまく行い、その答えが他の人にも役立つことを願っています.

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

c# - ThreadStatic へのアクセス - スレッド外からの変数

変数を ThreadStatic として定義しました。

ここで、MainThread (新しいスレッドを開始した) から変数 Monitoring を設定する必要があります。

これを行う方法はありますか?

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

c# - ThreadStatic フィールド VS メソッド パラメータ VS スレッドごとに 1 つのインスタンス

私はマルチスレッドアプリケーションで作業しているため、異なるスレッドで使用していた型インスタンスで競合を引き起こす可能性のあるプライベートフィールドを使用しないように常に努めていました。代わりに、メソッド パラメーターとして機能するために必要な情報を収集してきました。これにより、すべてが同じパラメーターを宣言する多数のメソッドが作成されました。

今、タイプを再設計し、スレッドごとに 1 つのインスタンスを作成することを考えていましたが、ThreadStatic 属性に出くわしました。

プライベートなスレッド静的フィールドを宣言し、各スレッドが呼び出しているメイン メソッド内でそれを初期化し、すべてのサブメソッド内でこのフィールドを再利用して、パラメーターを廃止することは良い考えですか? それとも、スレッドごとに新しいインスタンスを作成することに集中する必要があるので、何か欠点がありますか?