0

webclientメソッドと多数のスレッドを同時に実行して複数のファイルをダウンロードしたい。私のURL構造は変数'inti'に依存しているので、forループを使用してURLとファイルパスを生成します。問題は、開始されたスレッドが起動されるまで、URLとファイルパスの値が変更されることです。タイムラインは次のようになります。

メインループでは、url="url1"およびpath="filepath1"です。

Thread1は、値「url1」および「filepath1」で呼び出されます。

メインループでは、url="url2"およびpath="filepath2"です。

Thread2は、値「url2」および「filepath2」で呼び出されます。

Thread1は、値「url2」および「filepath2」で始まりました。

Thread2は、値「url2」および「filepath2」で始まりました。

エレガントな解決策は見つかりませんでした。あなたは何を提案しますか?

string path = "";
string url = "";
string baseURL = "http://www.somewebsite.com/12/";
for (int i = 10; i <= DateTime.Now.Month; i++)
{
    path = "C:\\folder\\" + i.ToString() + ".html";
    url = baseURL + i.ToString();
    Thread webThread = new Thread(delegate()
    {
       downloadScheduleFile(url,path);
    });
    webThread.Start()
}

private void downloadScheduleFile(string url, string filepath)
{
    var client = new WebClient();
    try
    {
       client.DownloadFile(url, filepath);
    }
    catch(WebException e) {
       Console.WriteLine(System.Threading.Thread.CurrentThread.Name+e.Message);
    }
}
4

3 に答える 3

2

それは、スレッドが開始するまでに、変更されているためpathですurl。より近いローカルコピーを作成する必要があります。

string baseURL = "http://www.somewebsite.com/12/";
for (int i = 10; i <= DateTime.Now.Month; i++)
{
    string path = "C:\\folder\\" + i.ToString() + ".html"; // path declared here
    string url = baseURL + i.ToString(); // url declared here
    Thread webThread = new Thread(delegate()
    {
       downloadScheduleFile(url,path);
    });
    webThread.Start()
}
于 2012-11-29T19:12:35.850 に答える
1

あなたがコードを書く方法は、downloadScheduleFileを呼び出すすべてのスレッドが、包含ブロックで定義された同じ2つの変数を参照しています。あなたがすべきことは、すべてのスレッドに独自の変数のセットを与えることです。

于 2012-11-29T19:15:59.123 に答える
-1

デリゲート内の外部スコープで変数をキャプチャする必要があります。これを実行できると確信しています。

string path = "";
string url = "";
string baseURL = "http://www.somewebsite.com/12/";
for (int i = 10; i <= DateTime.Now.Month; i++)
{
    path = "C:\\folder\\" + i.ToString() + ".html";
    url = baseURL + i.ToString();
    Thread webThread = new Thread(delegate()
    {
       string innerPath = path;
       string innerUrl = url
       downloadScheduleFile(innerUrl,innerPath);
    });
    webThread.Start()
}

しかし、同じ問題が発生する可能性があるので、試してみてください...

于 2012-11-29T19:16:53.300 に答える