【问题标题】:WebClient Timing out when Scheduled in TaskWebClient 在任务中调度时超时
【发布时间】:2012-10-10 17:00:45
【问题描述】:

大家好,这是我第一次尝试在 4.0 中使用任务库,所以如果您发现除了我的问题之外还有其他不正确的问题,请告诉我。

我的问题是,当我安排一堆内部使用 webclient 发出请求的任务时,前几个任务通过就好了,但是在一段时间后我的 webclient 开始抛出异常。就好像它创建了 webclient 然后坚持在 Task 中并等待一个线程来接它但是到那时超时时间已经达到了..这只是我的假设。

代码如下:

var TmsThread = Task.Factory.StartNew(() => UpdateTmsNullPackages(), TaskCreationOptions.LongRunning);

在 Windows 应用程序的 Form1_Load 中运行。这就是它所说的

public void UpdateTmsNullPackages()
    {
        Parallel.ForEach(TmsNullPackages, Package =>
        {
            try
            {
                Task<string> task = Task.Factory.StartNew(() => Package.GetPackageTmsId(), TaskCreationOptions.AttachedToParent);
                task.ContinueWith(t =>
                    {
                        if (!String.IsNullOrEmpty(t.Result))
                        {
                            Package.TMSID = t.Result;
                            NowTmsIdFoundPackages.Add(Package);
                        }
                    });
            }
            catch(Exception ex){}
        });
    }

依次运行这个

 public static string GetPackageTmsId(this TwcPackage Package)
    {
        string TMSID = null;
        if (!(String.IsNullOrEmpty(Package.movie_Provider)) && !(String.IsNullOrEmpty(Package.movie_Product)) && !(String.IsNullOrEmpty(Package.movie_Provider_ID)) && !(String.IsNullOrEmpty(Package.movie_Asset_ID)))
        {
            try
            {
                using (WebClient client = new WebClient())
                {
                    client.Credentials = new NetworkCredential(TMSID_Recheck.Properties.Settings.Default.WebRequestUser, TMSID_Recheck.Properties.Settings.Default.WebRequestProdUserPassWord);
                    XmlDocument xmlDoc = new XmlDocument();
                    string URLToBeRequested = TMSID_Recheck.Properties.Settings.Default.RequestProdBaseURL + TMSID_Recheck.Properties.Settings.Default.RequestAPIVersion + "/" + TMSID_Recheck.Properties.Settings.Default.RequestAPIProgramServiceCall + TMSID_Recheck.Properties.Settings.Default.RequestAPIProgramAssociationServiceCall + Package.movie_Provider + ':' + Package.movie_Product + ':' + Package.movie_Provider_ID + "::" + Package.movie_Asset_ID;
                    try
                    {
                        xmlDoc.LoadXml(client.DownloadString(URLToBeRequested));
                        XmlNodeList Program = xmlDoc.DocumentElement.SelectNodes("program");
                        if (Program.Count > 0) TMSID = Program[0].Attributes["TMSId"].Value.ToString();
                    }
                    catch (WebException ex)
                    {
                        if (ex.Status != WebExceptionStatus.Timeout)
                        {
                            if (((HttpWebResponse)ex.Response).StatusCode != HttpStatusCode.NotFound) {  }
                        }
                        else {  }
                    }
                }
            }
            catch (Exception ix) {  }
        }
        return TMSID;
    }

在几百个任务后调用 downloadstring 时会发生此问题,它会引发超时异常。

【问题讨论】:

    标签: c# .net multithreading c#-4.0 task-parallel-library


    【解决方案1】:

    在几百个任务后调用 downloadstring 时会出现问题

    在那个时间片内完成了多少任务?

    看起来您只是在排队太多请求。您的系统和远程服务器可能有适当的策略来限制同时连接的数量。

    解决方案(以及快速诊断测试)是在 ForEach 中使用 MaxDegreeOfParallelism。

    这是一个similar question,有一些很好的答案。

    【讨论】:

    • 在超时前大约有 600 人通过。每个任务是否使用其自己的 webclient 对象,然后将其处理或者它们都使用相同的?你能举一个 MaxDegreeOfParallelism 的例子吗?我应该将其设置为我的最大处理器数吗?
    • 他们各有各的。但问题可能是线程,而不是网络客户端。查看链接。
    • Parallel.ForEach(TmsNullPackages, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount * 20 }, Package => 我要试试这个看看是否超时。这需要一点时间
    • 好。但请注意,ProcessorCount 不如带宽和连接限制重要。
    • 试过 'new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }' 那应该是 8 但我仍然超时。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2013-01-11
    • 2012-03-03
    • 1970-01-01
    • 2011-09-22
    • 2020-01-30
    相关资源
    最近更新 更多