for (int x = 0; x < imagesSatelliteUrls.Count; x++)
{
if (!imagesSatelliteUrls[x].StartsWith("http://"))
{
imagesSatelliteUrls[x] = stringForSatelliteMapUrls + imagesSatelliteUrls[x];
}
using (WebClient client = new WebClient())
{
if (!imagesSatelliteUrls[x].Contains("href"))
{
client.DownloadFile(imagesSatelliteUrls[x],
UrlsDir + "SatelliteImage" + counter.ToString("D6"));
}
}
counter++;
}
這將文件下載文件。列表imagesSatelliteUrls包含按組排列的260個文件鏈接。
例如:
index[0] "Group 1"
index[1] some link ....
index[2] some link ....
.
.
.
index[34] "Group 2"
index[35] some link ....
index[36] some link ....
.
.
.
.
index[71] "Group 3"
等等有7組。 我希望它從每個組下載第一個文件togeather這意味着下載並行7個文件。組1中的第一個文件2 3 4 5 6 7 然後,如果其中一個文件在任何組中完成,它將開始從該組中下載下一個文件。
所以我會看到每秒7個文件下載和每個文件從另一個組。 一個文件在某個組中完成下載,它應該移動到同一組中的下一個文件並開始下載它。
我該怎麼辦?由於這個client.DownloadFile即時使用現在只是將文件下載文件。
試圖下載並行:
這是代碼:
Parallel.For(0, imagesSatelliteUrls.Count, /*new ParallelOptions { MaxDegreeOfParallelism = 20 },*/ x =>
{
if (!imagesSatelliteUrls[x].StartsWith("http://"))
{
imagesSatelliteUrls[x] = stringForSatelliteMapUrls + imagesSatelliteUrls[x];
}
using (WebClient client = new WebClient())
{
if (!imagesSatelliteUrls[x].Contains("href"))
{
client.DownloadFile(imagesSatelliteUrls[x],
UrlsDir + "SatelliteImage" + counter.ToString("D6"));
}
}
counter++;
}); // end of Paralle
唯一的例外是:
System.Net.WebException was unhandled by user code
HResult=-2146233079
Message=An exception occurred during a WebClient request.
Source=System
StackTrace:
at System.Net.WebClient.DownloadFile(Uri address, String fileName)
at System.Net.WebClient.DownloadFile(String address, String fileName)
at WeatherMaps.ExtractImages.<>c__DisplayClass2.<.ctor>b__0(Int32 x) in d:\C-Sharp\WeatherMaps\WeatherMaps\WeatherMaps\ExtractImages.cs:line 145
at System.Threading.Tasks.Parallel.<>c__DisplayClassf`1.<ForWorker>b__c()
InnerException: System.IO.IOException
HResult=-2147024864
Message=The process cannot access the file 'd:\localpath\Urls\SatelliteImage000000' because it is being used by another process.
Source=mscorlib
StackTrace:
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
at System.Net.WebClient.DownloadFile(Uri address, String fileName)
InnerException:
我也試過這個代碼:
for (int i = 0; i < 7; i++)
{
Task.Factory.StartNew(() =>
{
// Here you can easily implement your checking algo as you see fit
while (counter < imagesSatelliteUrls.Count)
{
if (!imagesSatelliteUrls[count].StartsWith("http://"))
{
imagesSatelliteUrls[count] = stringForSatelliteMapUrls + imagesSatelliteUrls[count];
}
using (WebClient client = new WebClient())
{
if (!imagesSatelliteUrls[count].Contains("href"))
{
client.DownloadFile(imagesSatelliteUrls[count], UrlsDir + "SatelliteImage" + counter.ToString("D6"));
}
}
lock (this)
{
count++;
counter++;
}
}
});
}
System.Net.WebException was unhandled by user code
HResult=-2146233079
Message=An exception occurred during a WebClient request.
Source=System
StackTrace:
at System.Net.WebClient.DownloadFile(Uri address, String fileName)
at System.Net.WebClient.DownloadFile(String address, String fileName)
at WeatherMaps.ExtractImages.<>c__DisplayClass4.<.ctor>b__2() in d:\C-Sharp\WeatherMaps\WeatherMaps\WeatherMaps\ExtractImages.cs:line 122
at System.Threading.Tasks.Task.InnerInvoke()
at System.Threading.Tasks.Task.Execute()
InnerException: System.IO.IOException
HResult=-2147024864
Message=The process cannot access the file 'd:\localpath\Urls\SatelliteImage000000' because it is being used by another process.
Source=mscorlib
StackTrace:
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy, Boolean useLongPath, Boolean checkHost)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access)
at System.Net.WebClient.DownloadFile(Uri address, String fileName)
InnerException:
如果找你針對.NET 4.0或更高看看http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx –
否則,你可能想看看C#上的線程。 – Rafael