我有一個大的COM對象,需要從Web服務中調用。所以我實現了一個IHttpAsyncHandler類,希望持有對COM對象的引用。這樣,請求之間的加載時間會減少。我在Windows 2003服務器上運行IIS 6。IHttpAsyncHandler卸載
這樣看來,在HttpHandler的組件(?)因爲我的靜態列表是在後續調用空加工後卸載。即使第二個通話幾乎立即發生,也會發生:
public class x2Handler : IHttpAsyncHandler, System.Web.SessionState.IRequiresSessionState
{
public bool IsReusable { get { return true; } }
private static List<AsynchOperation> _asynch = new List<AsynchOperation>();
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
{
AsynchOperation asynch = null;
foreach(AsynchOperation op in _asynch){
if (op.Completed){
asynch = op;
break;
}
}
if (asynch == null)
{
asynch = new AsynchOperation();
_asynch.Add(asynch);
}
asynch.Context = context;
asynch.Callback = cb;
asynch.State = extraData;
asynch.StartAsyncWork();
return asynch;
}
public void EndProcessRequest(IAsyncResult result)
{
}
public void ProcessRequest(HttpContext context)
{
throw new InvalidOperationException();
}
}
每當進程調用_asynch爲空時。應用程序池似乎沒有任何設置會導致程序集卸載。
如何使靜態變量保持通話之間的價值觀?編輯:我不知道它是否有助於解決這個問題,但如果我有一個斷點,它被擊中,然後我刪除斷點,當代碼再次執行(由於另一個HTTP請求)斷點仍然設置。
編輯:我添加了一個析構函數的類,並放置一個斷點,以確定什麼是殺害類,它正在從一個「過渡的AppDomain」叫。
編輯:我已經嘗試從IRequiresSessionState繼承,然後分配一個測試值的上下文.Session和context.Application,都不保留它們之間的調用值。那麼應用程序池是否可以在調用之間釋放?
'名單'不是線程安全的類型。如果你想在多線程環境中使用它,你必須使用適當的鎖定機制來同步對它的訪問。 –
@DarinDimitrov謝謝,將做 –
'IHttpAsyncHandler'用於在長時間運行期間釋放工作線程。我不認爲這是你的問題。你應該更好地描述你對COM對象的問題(並着重於此)。它只是持有一個引用它,所以它不會被卸載? – Codo