3

私のaspxページでは、STAを使用するCOMコンポーネントを呼び出します。したがって、aspcompat = trueパラメーターを使用しますが、ロジックを理解したいと思います。それは正確に何をしますか?私の知る限り、STAでは、1つのスレッドによってのみ呼び出されると想定されています。だから私は自分でスレッドセーフを提供する必要があります。

そうだとすれば、aspcompatパラメーターはどこでスレッドセーフを提供しますか?ページ全体、またはSTAコンポーネントにアクセスするポイントだけですか?

4

3 に答える 3

2

Visual Basic を使用して開発されたコンポーネントなどのシングルスレッド アパートメント (STA) COM コンポーネントを ASP.NET ページから使用する場合は、互換性属性AspCompat=true

<%@ Page>

ASP.NET ページのタグ

AspCompat 属性は、ページを強制的に STA モードで実行します。

ASP.NET はデフォルトで MTA (マルチスレッド アパートメント) スレッドを使用します。

VB6 または Visual FoxPro (MTDLL) で作成されたものなど、古い学校の COM オブジェクトとやり取りする ASP.NET アプリケーションを構築する場合、要求を処理するスレッドがシングル スレッド アパートメント スレッドを使用することが非常に重要です。STA は、基本的にシングル スレッド コンポーネントがマルチスレッド環境で確実に動作できるようにする COM 組み込みテクノロジです。STA は、特定のスレッドでインスタンス化された COM オブジェクトがその特定のスレッドにとどまり、別のスレッドから COM オブジェクトにアクセスすると、そのスレッドを STA スレッドに自動的にマーシャリングすることを保証します。最終的な結果として、複数のスレッドを持つことができますが、COM オブジェクト インスタンスは変更されない固定スレッド上に存在します。

ASP.NET は既定で、MTA (マルチスレッド アパートメント) スレッドを使用します。これは、COM オブジェクトのマーシャリングに注意を払わない、真に自由に回転するスレッドです。これは、特定のスレッドでコードを実行してもよいかどうか、または何らかのスレッド/COM マーシャリングが必要かどうかを判断する際に少しオーバーヘッドがある STA スレッド化よりもはるかに効率的です。MTA COM コンポーネントは非常に効率的ですが、マルチスレッド環境の STA COM コンポーネントは常にかなりの量のオーバーヘッドを持つ傾向があります。

ASP.NET の STA

Support for STA threading in the ASP.NET framework is fairly limited. Specifically only the original ASP.NET WebForms technology supports STA threading directly via its STA Page Handler implementation or what you might know as ASPCOMPAT mode. For WebForms running STA components is as easy as specifying the ASPCOMPAT attribute in the @Page tag:

<%@ Page Language="C#" AspCompat="true" %>

which runs the page in STA mode. Removing it runs in MTA mode. Simple.

STA for non supporting ASP.NET Technologies

only WebForms supports STA natively

  • ASP.NET HttpHandlers
  • ASMX Web Services
  • ASP.NET MVC
  • WCF Web Services
  • ASP.NET Web API

STA components are a pain in the ass. I feel your pain :-)

Good reference:

https://weblog.west-wind.com/posts/2012/Sep/18/Creating-STA-COM-compatible-ASPNET-Applications#STAfornonsupportingASP.NETTechnologies

于 2016-06-06T12:34:44.363 に答える
1

これは引用です。Pro .NET パフォーマンス

デフォルトでは、AsP.nET は MTA スレッドでページを実行します。sTA オブジェクトを呼び出すと、マーシャリングが行われます。主に sTA オブジェクトを呼び出すと、パフォーマンスが低下します。次のように ASPCOMPAT 属性でページをマークすることで、これを修正できます。

<%@Page Language = "vb" AspCompat = "true" %>

ページ コンストラクターは引き続き MTA スレッドで実行されるため、sTA オブジェクトの作成は Page_Load および Page_Init イベントまで延期してください。

于 2015-03-12T21:48:46.210 に答える
1

このディレクティブにより、ASP.NET は ASP 組み込みオブジェクトへのアクセスを提供し、スレッド プールを MTA に変更します。

詳細については、これをチェックアウトしてください

于 2011-03-06T18:13:38.393 に答える