1

やあみんなこれは4.0でタスクライブラリを使用する私の最初の試みですので、あなたが私の問題以外に正しくない何かを見つけたら私に知らせてください。

私の問題は、内部でWebクライアントを使用して要求を行う一連のタスクをスケジュールすると、最初のいくつかは問題なく実行されますが、一定時間後にWebクライアントが例外をスローし始めることです。Webクライアントを作成するかのように、タスクに固執し、スレッドがそれを取得するのを待ちますが、その時点でタイムアウト時間に達します..それは私の仮定です。

コードは次のとおりです。

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が呼び出されると、タイムアウト例外がスローされるときに発生します。

4

1 に答える 1

1

この問題は、数百のタスクの後に downloadstring が呼び出されたときに発生します

そして、そのタイム スライスで完了したタスクの数は?

あまりにも多くのリクエストをキューに入れているだけのようです。システムとリモート サーバーには、同時接続数を制限するポリシーが設定されている可能性があります。

解決策 (および簡単な診断テスト) は、ForEach で MaxDegreeOfParallelism を使用することです。

ここにいくつかの良い答えがある同様の質問があります。

于 2012-10-10T17:13:07.143 に答える