1

Asp.Net でオブジェクト インスタンスがオブジェクト エラーのインスタンスに設定されていません

ASP.Net Web アプリケーションでこのエラーが時々発生し、その方法を理解できません。スタック トレースからこのコードにたどり着き、行は HashTable の Add メソッドへの呼び出しのいずれかです。コードはモジュール内にあり、ハッシュ テーブルはそのモジュール内のプライベート変数として宣言されています。

Debug.Asserts を追加しましたが、これまでのところ、これらはエラーの行番号を Add メソッドが呼び出される別の行にプッシュしただけです。派生クラスで Hashtable の Add メソッドをオーバーライドしていません。「gstr」で始まるパラメーターは、別のモジュールでインスタンス化された文字列定数です。

Add メソッド (_hshBaseTables を Null にすることはできません) を 1 回呼び出してから、この例外を発生させるにはどうすればよいでしょうか?

<System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
Friend Module modFieldAliases

#Region "Private Data"

'Tables created by InitFieldAliasHashTable and destroyed by calling UnInitFieldAliasHashTable
'private variable to hold lookup table for field aliases.
Private _hshFieldAliases As System.Collections.Hashtable 'use this to obtain underlying field information given the field alias
Private _hshTableAliases As System.Collections.Hashtable 'use this to obtain the base table and column given table alias
Private _hshBaseTables As System.Collections.Hashtable 'use this to obtain table alias from base table
Private _hshBaseColumns As System.Collections.Hashtable 'use this to obtain field alias from base table and column pair  

...

If _hshBaseTables IsNot Nothing Then

    _hshBaseTables = System.Collections.Specialized.CollectionsUtil.CreateCaseInsensitiveHashtable(50)

    Debug.Assert(_hshBaseTables IsNot Nothing)
    _hshBaseTables.Add("Alias", gstrALIAS)
    Debug.Assert(_hshBaseTables IsNot Nothing)
    _hshBaseTables.Add("BlobData", gstrBLOBDATA)
    Debug.Assert(_hshBaseTables IsNot Nothing)
    _hshBaseTables.Add("ContactLink", gstrCONTACTLINK)
    Debug.Assert(_hshBaseTables IsNot Nothing)
    _hshBaseTables.Add("CustomForms", gstrCUSTOMFORMS)...

スタック トレースは次のとおりです。

at modFieldAliases.InitFieldAliasHashTable() in C:\Ajexus 4.59\CriteriaSet\FieldAliases.vb:line 2701
at Ajexus.CriteriaSet._initialize() in C:\Ajexus 4.59\CriteriaSet\CriteriaSet.vb:line 41
at Ajexus.CriteriaSet..ctor() in C:\Ajexus 4.59\CriteriaSet\CriteriaSet.vb:line 46
at Model.GetData(String method, Dictionary`2 data) in C:\Ajexus 4.59\Ajexus MVP Framework\Model.vb:line 424
at Ajexus.Framework.ReportsHelper.GetUserCriteriaListContents(String strFieldAlias, CriteriaSet csPredefinedReportCriteria, CriteriaSet csReportCriteria) in C:\Ajexus 4.59\Ajexus MVP Framework\ReportsHelper.vb:line 560
at Ajexus.Framework.Presenters.Summary2ViewPresenter._fillUserCriteriaList(CriteriaSet csPredefinedReport, String strFieldAlias, String strFieldLabel, String strDisplayMember, String strValueMember) in C:\Ajexus 4.59\Ajexus MVP Framework\Presenters\Summary2.aspx.presenter.vb:line 173
at Ajexus.Framework.Presenters.Summary2ViewPresenter.OnFillUserCriteriaFieldList(Object sender, AjexusFieldEventArgs e) in C:\Ajexus 4.59\Ajexus MVP Framework\Presenters\Summary2.aspx.presenter.vb:line 836
at Ajexus.Web.Views.Summary2.fvwUserCriteria_PreRender(Object sender, EventArgs e) in C:\Ajexus 4.59\AjexusWeb\Summary2.aspx.vb:line 80
at System.Web.UI.Control.PreRenderRecursiveInternal()
at System.Web.UI.Control.PreRenderRecursiveInternal()
at System.Web.UI.Control.PreRenderRecursiveInternal()
at System.Web.UI.Control.PreRenderRecursiveInternal()
at System.Web.UI.Control.PreRenderRecursiveInternal()
at System.Web.UI.Control.PreRenderRecursiveInternal()
at System.Web.UI.Control.PreRenderRecursiveInternal()
at System.Web.UI.Control.PreRenderRecursiveInternal()
at System.Web.UI.Control.PreRenderRecursiveInternal()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

追加情報 _hshBaseTables 変数は、例外がキャッチされ、通常、スタック トレースが以前とは異なる行を示している場合は Nothing です。ただし、それは常に Nothing のチェックの後、および例外がスローされていないほぼ同一のコード行の後です。これは、このスレッドが Add メソッドを呼び出す間に、別のスレッドによって Nothing に設定されたに違いないことを示唆していませんか? hshBaseTables は、私のアプリケーションで使用される別のコンポーネントにも含まれている Friend モジュールのプライベート変数です。

4

2 に答える 2

1

コメントでアンドリューとジョンが指摘した答えは、上記のコードが VB.Net に含まれているということですModule。これは、すべてのメンバーが であることを意味しますShared。すべてのユーザーとすべての要求に対して使用できるコピーは 1 つだけです。ある時点でNothing、別の要求スレッドがまだ使用しようとしている間に、この変数が に設定されます。この場合、すべてのユーザーが 1 つのコピーのみを使用できるようにすることは目的に合っていますが、 が に_hshBaseTables設定されていないことを確認する必要がありNothingます。

于 2013-07-23T21:42:34.290 に答える