Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用IIS和异步方法的WCF最大并发会话数-释放资源_C#_.net_Wcf_Concurrency_Asynchronous Wcf Call - Fatal编程技术网

C# 使用IIS和异步方法的WCF最大并发会话数-释放资源

C# 使用IIS和异步方法的WCF最大并发会话数-释放资源,c#,.net,wcf,concurrency,asynchronous-wcf-call,C#,.net,Wcf,Concurrency,Asynchronous Wcf Call,我正在通过表单调用WCF服务。服务托管在IIS中。具有以下属性的服务:InstanceContextMode.PerSession,ConcurrencyMode=ConcurrencyMode.Multiple 我已将所有并发调用、实例和会话的限制行为设置为最大值2000 然而,我似乎不能得到超过200个异步请求。在此之后,服务没有响应,会话最终超时 我使用异步调用来调用服务ie中的方法 折叠|复制代码 IASyncResult res=Proxy.BeginMethod(endCall,nu

我正在通过表单调用WCF服务。服务托管在IIS中。具有以下属性的服务:InstanceContextMode.PerSession,ConcurrencyMode=ConcurrencyMode.Multiple

我已将所有并发调用、实例和会话的限制行为设置为最大值2000

然而,我似乎不能得到超过200个异步请求。在此之后,服务没有响应,会话最终超时

我使用异步调用来调用服务ie中的方法 折叠|复制代码

IASyncResult res=Proxy.BeginMethod(endCall,null)

然后为了捕获响应,我有一个endCall函数,它接收IASyncResult并通过EndMethod()处理结果

在一次负载模拟@1方法调用中,每秒钟都可以正常工作,直到大约200次调用,然后等待。。。(我从这200个电话中得到了199或198个回复)——所以理论上不应该有200个并发会话,只有2个左右

也许有一些垃圾收集或关闭,我没有做? 有什么建议吗

----更新---

我认为答案可能更多的是代理的关闭没有以线程安全的方式处理。正如Radik在上面指出的,关闭代理很重要,但是由于同时出现许多IASyncState结果,您必须确保在正确的时间关闭正确的代理

我确实尝试过从线程启动close代理,让它单独处理它:

QueueUserWorkItem(CloseProxy,ar.AsyncState)


但这似乎不起作用。对此有何建议?

当您在VS中创建服务引用时,生成的代理允许您通过回调或事件处理程序两种方式异步调用服务。还有两个可以关闭代理的不同位置。 小样本项目

//在回调函数中关闭代理
私有void按钮callbackclick(对象发送方,事件参数e)
{
var proxy=新的服务客户机(“BasicHttpBinding_iSeries设备”);
proxy.BeginDoWork(DateTime.Now.ToShortDateString(),回调,代理);
}
私有无效回调(IAsyncResult ar)
{
var result=(ar.asynchState作为ServiceClient).EndDoWork(ar);
如果(应收账款已完成)
更新视图(结果);
CloseProxy(ar.AsyncState);
}
//关闭事件处理程序中的代理
私有无效按钮完成单击(对象发送者,事件参数e)
{
var proxy=新的服务客户机(“BasicHttpBinding_iSeries设备”);
DoWorkAsync(DateTime.Now.ToSortDateString());
proxy.DoWorkCompleted+=DoWorkCompleted;
}
私有void DoWorkCompleted(对象发送方,DoWorkCompletedEventArgs e)
{
如果(e.Error==null)
更新视图(如结果);
CloseProxy(发送方);
}
私有静态void CloseProxy(对象发送方)
{
var proxy=发送方作为ServiceClient;
if(proxy==null)返回;
尝试
{
proxy.Close();
}
捕获(通信异常e)
{
proxy.Abort();
}
捕获(超时异常e)
{
proxy.Abort();
}
捕获(例外e)
{
proxy.Abort();
}
}
私有静态bool_run=false;
//以无限周期运行异步查询
私有无效按钮循环单击(对象发送者,事件参数e)
{
_跑步=!\u跑步;
如果(!\u运行)返回;
动作=等待事件;
QueueUserWorkItem(a=>action(action));
}
私有void WaitEvent(对象操作)
{
var proxy=新的服务客户机(“BasicHttpBinding_iSeries设备”);
DoWorkAsync(DateTime.Now.ToSortDateString());
proxy.DoWorkCompleted+=(x,y)=>DoWorkCompleted(x,y,动作作为动作);
}
私有void DoWorkCompleted(对象发送方,DoWorkCompletedEventArgs e,操作)
{
如果(!\u运行)
返回;
如果(e.Error==null)
更新视图(如结果);
CloseProxy(发送方);
行动(行动);
}

您是否正确地关闭了连接?了解如何使用Close(),因为这将在仍然返回异步操作结果时关闭整个连接。。。我确实执行了AsynchWaithHandle.close(),但这没有帮助…res.EndMethod();试过了。。它不起作用,并导致与上述相同的问题
//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);
}