0

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

在 WPF 应用程序中,CLR 调用 GetRequestStreamCallback 之前大约有 30 秒。在 Web 应用程序中,它更像是 40 毫秒。我怀疑这与 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
}

}

4

1 回答 1

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;

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

于 2013-09-17T20:41:49.290 回答