BeginGetRequestStream需要很长时间才能在WPF中进行回调

时间:2013-09-13 21:51:33

标签: asp.net wpf multithreading asp.net-web-api

我有一个负载测试器应用程序,并使用异步web api向测试服务器发送大量流量。该应用程序有2个GUI化身:一个是通过标准.aspx表单控制的Web应用程序。另一个是WPF表单应用程序。然而http代码在两种情况下都是相同的,所以我对性能差异的原因感到困惑。

在WPF应用程序中,CLR调用GetRequestStreamCallback之前大约需要30秒。在Web应用程序中,它更像是40ms。我怀疑这与2个应用程序中的线程模型有关(这里没有显示很多线程)。由于GetRequestStreamCallback是一个回调,因此我不会影响它的优先级。

感谢任何见解, 亚伦

public class PendingRequestWrapper
{
    public HttpWebRequest request;
    PendingRequestWraqpper(HttpWebRequest req) {request = req;}
}

public class Poster
{
    public static void SendPost(string url) {
        HttpWebRequest request = (HttpWebRequest)
            WebRequest.Create(url);
        request.Method = "POST";
        // more header setup ...

        PendingRequestWrapper = new PendingRequestWrapper(request);
        wrap.request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), wrap);        
}
private static void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
    PendingRequestWrapper wrap = asynchronousResult.AsyncState as PendingRequestWrapper;

    try {
        // End the operation
        System.Diagnostics.Debug.Writeln("Received req stream for " + wrap.request.RequestUri.ToString());
        Stream postStream = wrap.request.EndGetRequestStream(asynchronousResult);
    } catch(Exception e) 
    {
        // ...
    }
    // Use the stream
}

}

1 个答案:

答案 0 :(得分:0)

默认情况下,WPF的asp.net Web性能低于IIS Web应用程序的原因是每个主机的默认连接限制为2.而在IIS应用程序中,它默认为32k。解决方法是:

        ServicePoint myPoint = ServicePointManager.FindServicePoint(new Uri("http://example.com"));

        // WPF application needs this!
        myPoint.ConnectionLimit = 10000;

这可能与除了打开与同一主机的多个连接的负载测试类型之外的所有应用程序无关。