如何防止在线程池上执行BeginGetResponse

时间:2013-08-08 13:24:08

标签: c# .net .net-3.5 httpwebresponse

我的桌面.NET 3.5应用程序使用WebRequest.BeginGetResponse发出用于实现长轮询的请求。此请求通常需要10秒或更长时间才能处理。问题是BeginGetResponse执行等待请求在线程池上完成,然后线程池似乎正在挨饿。有没有办法如何指定自定义线程或BeginGetResponse使用的自定义线程?

作为替代方案,我也可以使用我自己的线程使用WebRequest.GetResponse执行同步请求(希望这是really synchronous in .NET 3.5,它was not in .NET 1.0),但是我有一个问题我无法当我需要退出应用程序时,提前终止请求,因为我看不到如何中止同步请求的干净方法。

1 个答案:

答案 0 :(得分:1)

我不知道您使用的是WPF还是Windows窗体..这是一个WPF示例。

        WebRequest w = HttpWebRequest.Create("http://www.google.com");

        Dispatcher dispatcher = Dispatcher.CurrentDispatcher;

        Thread thread = new Thread(new ThreadStart(() =>
            {
                WebResponse response = w.GetResponse();
                dispatcher.BeginInvoke(new Action(() =>
                {

                    // Handle response on the dispatcher thread.

                }), null);
            }));

        thread.IsBackground = true;
        thread.Start();

注意IsBackground = true。因此,您的应用程序将在退出时终止它。 也可以将HttpWebRequest.Create放在线程方法中。

Windows.Form等效

        WebRequest w = HttpWebRequest.Create("http://www.google.com");

        Thread thread = new Thread(new ThreadStart(() =>
            {
                WebResponse response = w.GetResponse();
                this.BeginInvoke(new Action(() =>
                {

                    // Handle response on the dispatcher thread.

                }), null);
            }));

        thread.IsBackground = true;
        thread.Start();

是表单/控件