相关疑难解决方法(0)

.NET如何使用IO线程或IO完成端口?

我们有一个.NET应用程序,可以对各种Web服务进行多次并发调用,收集它们的响应,然后根据这些响应进行一些计算.在尝试获得额外性能时,我一直在研究使用通过使用IO完成端口来使用.NET的IO线程的方法.我已经阅读了几个资源,包括Joe Duffy最近出版的"Windows上的并发编程"一书,当我"了解"它们的用处时,我对它们在.NET中的行为有点不清楚,我正在寻找一个简洁的解释.

.net concurrency performance

31
推荐指数
1
解决办法
1万
查看次数

System.Net.ServicePointManager.DefaultConnectionLimit和.MaxServicePointIdleTime

您何时需要调整这两个设置(如下)?这两个数字对HttpWebRequest我所做的实例意味着什么?

  1. System.Net.ServicePointManager.DefaultConnectionLimit
  2. System.Net.ServicePointManager.MaxServicePointIdleTime

是否ServicePoint请求特定于域名或每个唯一URI的对象?

.net asp.net rest web-services servicepoint

25
推荐指数
1
解决办法
2万
查看次数

HttpWebResponse不会扩展并发出站请求

我有一个用C#编写的ASP.NET 3.5服务器应用程序.它使用HttpWebRequest和HttpWebResponse向REST API发出出站请求.

我已经设置了一个测试应用程序来在不同的线程上发送这些请求(模糊地模仿服务器的并发性).

请注意,这更像是单声道/环境问题,而不是代码问题; 所以请记住,下面的代码不是逐字的; 只是功能位的剪切/粘贴.

这是一些伪代码:

// threaded client piece
int numThreads = 1;
ManualResetEvent doneEvent;

using (doneEvent = new ManualResetEvent(false))
        {

            for (int i = 0; i < numThreads; i++)
            {

                ThreadPool.QueueUserWorkItem(new WaitCallback(Test), random_url_to_same_host);

            }
            doneEvent.WaitOne();
        }

void Test(object some_url)
{
    // setup service point here just to show what config settings Im using
    ServicePoint lgsp = ServicePointManager.FindServicePoint(new Uri(some_url.ToString()));

        // set these to optimal for MONO and .NET
        lgsp.Expect100Continue = false;
        lgsp.ConnectionLimit = 100;
        lgsp.UseNagleAlgorithm = true; …
Run Code Online (Sandbox Code Playgroud)

c# apache mono httpwebresponse servicepoint

12
推荐指数
2
解决办法
2954
查看次数

如何重用FtpWebRequest连接

我需要在FTP服务器上列出数千个文件,并删除必要的文件.您可以猜测,性能至关重要,因此我需要一种方法来重用FTP连接.

关于FtpWebRequests的连接使用情况,MSDN上没有足够的解释!它只说"如果可能,多个FtpWebRequests重用现有连接." "如果可能"是什么意思?我想控制何时关闭连接,简单就是这样!任何的想法?

问候

.net ftpwebrequest

8
推荐指数
1
解决办法
3555
查看次数

HttpWebRequest和I/O完成端口

我正在开发一个应用程序,它需要一种类型的消息才能访问数据库,而另一种类型的消息则需要一些外部的xml api.

我必须处理A LOT ...其中一个重大挑战是让HttpWebRequest类表现良好.我最初开始只使用标准的同步方法和线程整个事情.这不好.

因此,经过一些阅读后,我看到推荐的方法是使用Begin/End方法将工作委托给IO完成端口,从而释放线程池并产生更好的性能.这似乎不是这样的......性能稍微好一些,但我当然看不到与threadpool相比使用的IO完成端口.

我有一个旋转的线程,并向我发送线程池中可用的工作线程+完成端口.完成端口总是非常低(我看到最多使用9个)并且我总是使用大约120个工作线程(有时更多).我在以下所有方法中使用开始/结束模式httpwebrequest:

Begin/EndGetRequestStream
Begin/EndWrite (Stream)
Begin/EndGetResponse
Begin/EndRead (Stream)
Run Code Online (Sandbox Code Playgroud)

我做得对吗?我错过了什么吗?我可以同时使用(有时)多达2048个http连接(来自netstat输出) - 为什么完成端口号会这么低?

如果有人能就如何处理这个管理工作线程,完成端口提供一些认真的建议,httpwebrequest那将非常感谢!

编辑:.NET是一个合理的工具吗?我可以使用.NET和System.Net堆栈获得大量的http连接吗?有人建议使用像WinHttp(或其他一些C++库)这样的东西,并从.NET中调用它,但这不是我特别想做的事情!

c# multithreading httpwebrequest threadpool io-completion-ports

6
推荐指数
1
解决办法
2771
查看次数

当客户端连接到'localhost'上的服务时,为什么System.Net.ServicePoint.ConnectionLimit使用'7FFFFFFF'(Int32.MaxValue/2147483647)?

为什么当客户端连接到'localhost'上的服务时,System.Net.ServicePoint.ConnectionLimit使用'7FFFFFFF'(Int32.MaxValue/2147483647),而如果服务在远程计算机上运行,​​它决定使用'2'作为默认值?

最初我认为如果没有设置servicepoint.connectionlimit,它将是ServicePointManager.DefaultConnectionLimit.但是,我刚刚意识到(一旦我从客户那里得到了一个问题),那就是它的Int32.MaxValue/2147483647.

我做了一些研究(详情请参考下面的链接),但是我无法找到它用于int32.maxvalue的原因.我可以猜测它可能是为了更好的性能,因为输入请求和响应消息不会越过边界.

我的问题:

  1. 为什么Int32.MaxValue如果服务在'localhost'上运行?(我在英语中的任何解释;)我从反射器复制的代码片段也很棒 - 因为我猜想的意图 - 但完全不了解代码:))
  2. 我理解它的性能 - 但从'2'(默认)到'int32.maxvalue'听起来很响.换句话说,只要请求不通过网络,为什么打开尽可能多的TCP连接是可以的.(换句话说 - 为什么默认为int32.maxvalue - 不会有副作用)

一些与此相关的有用链接:

在httpwebrequest中创建TCP连接的方式和位置,以及它与servicepoint的关系如何?

http://blogs.microsoft.co.il/idof/2011/06/20/servicepointmanagerdefaultconnectionlimit-2-depends/

http://msdn.microsoft.com/en-us/library/system.net.servicepoint.connectionlimit(v=vs.110).aspx

http://arnosoftwaredev.blogspot.com/2006/09/net-20-httpwebrequestkeepalive-and.html

Reflector的代码片段

  public int ConnectionLimit
        {
            get
            {
                if ((!this.m_UserChangedLimit && (this.m_IPAddressInfoList == null)) && (this.m_HostLoopbackGuess == TriState.Unspecified))
                {
                    lock (this)
                    {
                        if ((!this.m_UserChangedLimit && (this.m_IPAddressInfoList == null)) && (this.m_HostLoopbackGuess == TriState.Unspecified))
                        {
                            IPAddress address = null;
                            if (IPAddress.TryParse(this.m_Host, out address))
                            {
                                this.m_HostLoopbackGuess = IsAddressListLoopback(new IPAddress[] { address }) ? TriState.True : TriState.False;
                            } …
Run Code Online (Sandbox Code Playgroud)

.net c# asp.net servicepoint

6
推荐指数
1
解决办法
2784
查看次数