2012-10-10 236 views
1

嘿,這是我第一次嘗試在4.0中使用任務庫,所以如果你看到其他任何東西,除了我的問題,這是不正確的,請讓我知道。WebClient計劃任務計劃任務

我的問題是,當我安排一堆內部使用webclient發出請求的任務時,前幾個通過就好了,但在一段時間後,我的webclient開始拋出異常。就好像它創建了webclient然後粘在任務中,並等待一個線程來提取它,但到那個時候達到了超時時間..這只是我的假設。

下面是代碼:

變種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被稱爲後幾百任務,它拋出一個超時異常時的問題發生。

回答

1

問題時downloadstring是一對夫婦後,叫百級的任務

有多少任務都在該時間片完成情況?

看起來你只是排隊太多的請求。您的系統和遠程服務器可能有適當的策略來限制同時連接的數量。

解決方案(和快速診斷測試)將使用ForEach中的MaxDegreeOfParallelism。

這是一個similar question有一些很好的答案。

+0

在超時之前約有600個通過。每個任務是否都使用自己的webclient對象,然後處理它們,或者它們都使用相同的對象嗎?你能舉一個MaxDegreeOfParallelism的例子嗎?我應該將其設置爲最高處理器數量嗎? – user1538704

+0

他們每個人都有自己的。但問題可能是線程,而不是webclients。查看鏈接。 –

+1

Parallel.ForEach(TmsNullPackages,new ParallelOptions {MaxDegreeOfParallelism = Environment.ProcessorCount * 20},Package =>我將試試這個,看看是否得到超時,這將需要 – user1538704