2011-09-17 17 views
0

我正在從窗體調用WCF服務。服務在IIS中託管。具有以下屬性的服務:InstanceContextMode.PerSession,ConcurrencyMode = ConcurrencyMode.Multiple使用IIS和Asynch方法的WCF的最大併發會話 - 釋放資源

對於所有併發調用,實例和會話,我已將限制行爲設置爲最大值爲2000。

但是我似乎無法獲得超過200個ASYNCH請求。之後,該服務不響應,會話最終超時。

我使用的非同步調用來調用服務的方法,即 崩潰|複製代碼

IASyncResult res = Proxy.BeginMethod(endCall,null);

然後趕上我有一個結束呼叫函數,它在IAsyncResult的和經由EndMethod處理()的結果的響應。

在負載模擬@ 1種方法

撥打第二個電話,這一切工作正常,直到大約200元話費,然後只是等待......(我從那些200個電話199級或198的響應在這個時間點).. - 理論上不應該有200個併發會話,只有2個左右..

也許有一些垃圾收集或關閉,我不是在做什麼? 有什麼建議嗎?

----更新---

我想答案也許更多的是代理的關閉在一個線程安全的方式不被處理。正如Radik在上面指出的那樣,關閉代理非常重要,但是,在同時出現許多IASyncState結果時,您必須確保在正確的時間關閉正確的代理。

我曾嘗試從一個線程發射了緊密的代理,讓它分開處理:

ThreadPool.QueueUserWorkItem(CloseProxy,ar.AsyncState);

但這似乎並不奏效。對此有何建議?

+0

您是否正確關閉連接?看到如何 [closing-wcf-connection](http://stackoverflow.com/questions/1400010/closing-wcf-connection) – Radik

+0

我不能使用Close(),因爲這將關閉整個連接,當仍然存在異步操作結果回來...... 我做執行Asynchwaithandle.close() 這沒有幫助,但... – Faroukg

回答

1

在VS中創建服務引用時,生成的代理允許您通過回調或事件處理程序以兩種方式異步調用服務。和兩個不同的地方,你可以關閉代理。 小樣本項目here

//close proxy in callback function 
private void ButtonCallbackClick(object sender, EventArgs e) 
{ 
    var proxy = new ServiceClient("BasicHttpBinding_IService"); 
    proxy.BeginDoWork(DateTime.Now.ToShortDateString(), CallBack, proxy); 
} 

private void CallBack(IAsyncResult ar) 
{ 
    var result = (ar.AsyncState as ServiceClient).EndDoWork(ar); 
    if (ar.IsCompleted) 
     UpdateView(result); 
    CloseProxy(ar.AsyncState); 
} 
//close proxy in event handler 
private void ButtonCompletedClick(object sender, EventArgs e) 
{ 
    var proxy = new ServiceClient("BasicHttpBinding_IService"); 
    proxy.DoWorkAsync(DateTime.Now.ToShortDateString()); 
    proxy.DoWorkCompleted += DoWorkCompleted; 
} 

private void DoWorkCompleted(object sender, DoWorkCompletedEventArgs e) 
{ 
    if (e.Error == null) 
     UpdateView(e.Result); 
    CloseProxy(sender); 
} 

private static void CloseProxy(object sender) 
{ 
    var proxy = sender as ServiceClient; 
    if (proxy == null) return; 
    try 
    { 
     proxy.Close(); 
    } 
    catch (CommunicationException e) 
    { 
     proxy.Abort(); 
    } 
    catch (TimeoutException e) 
    { 
     proxy.Abort(); 
    } 
    catch (Exception e) 
    { 
     proxy.Abort(); 
    } 
} 

private static bool _run = false; 
//run async query in infinite cycle 
private void ButtonCycleClick(object sender, EventArgs e) 
{ 
    _run = !_run; 
    if (!_run) return; 
    Action<object> action = WaitEvent; 
    ThreadPool.QueueUserWorkItem(a => action(action)); 
} 

private void WaitEvent(object action) 
{ 
    var proxy = new ServiceClient("BasicHttpBinding_IService"); 
    proxy.DoWorkAsync(DateTime.Now.ToShortDateString()); 
    proxy.DoWorkCompleted += (x, y) => DoWorkCompleted(x, y, action as Action<object>); 
} 

private void DoWorkCompleted(object sender, DoWorkCompletedEventArgs e, Action<object> action) 
{ 
    if (!_run) 
     return; 

    if (e.Error == null) 
     UpdateView(e.Result); 
    CloseProxy(sender); 
    action(action); 
} 
+0

res.EndMethod(); < - res是IASyncResult並且沒有EndMethod()。你的意思是Proxy.EndMethod(res)? – Faroukg

+0

抱歉,試圖從內存中寫入 – Radik

+0

嘗試過..它不起作用並導致與上述相同的問題 – Faroukg