嘿,這是我第一次嘗試在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被稱爲後幾百任務,它拋出一個超時異常時的問題發生。
在超時之前約有600個通過。每個任務是否都使用自己的webclient對象,然後處理它們,或者它們都使用相同的對象嗎?你能舉一個MaxDegreeOfParallelism的例子嗎?我應該將其設置爲最高處理器數量嗎? – user1538704
他們每個人都有自己的。但問題可能是線程,而不是webclients。查看鏈接。 –
Parallel.ForEach(TmsNullPackages,new ParallelOptions {MaxDegreeOfParallelism = Environment.ProcessorCount * 20},Package =>我將試試這個,看看是否得到超時,這將需要 – user1538704