What happens in case of a powercut?
What do you mean a "powercut"? If you mean loss of power, the only way you can know which threads didn't finish is to use a file to persist each thread's URL that they're working on and whether or not they've finished. This is common in many caching situations.
As far as using threads, using an array list isn't really necessary because you'll have to pass an index to each thread for them to determine which one to work on. Instead, read each ID from the XML file like you're doing and use asynchronous calls to download the file, like
HttpWebRequest.BeginGetResponse. You'll pass an
AsyncCallback that can write to that cache file I mentioned. If you track how many IDs you read and then keep a counter for how many times the callback was executed (be sure to use locking to increment the counter to make sure, for instance using the
lock keyword) you can know which ID was last (by checking the
IAsyncResult.AsyncState, which you would pass into
HttpWebRequest.BeginGetResponse - this is used to pass custom data from the async call to the callback for cases such as this).
You could also devise a similar situation using the
ThreadPool.QueueUserWorkItem, which also uses a delegate to start in a new thread and accepts a state object (which can be a single object of any type, including an array, list, or collection of other objects). The simple
Thread class doesn't now allow such state variables and there is additional benefits to using a
ThreadPool over simple threads. (See the SDK documentation for details.)
I would recommend asynchronous calls, though. The functionality is provided so you might as well use it. Also keep in mind that if you devise your own system using delegates, that the C# compilers (and probably others) automatically add asynchronous versions of the
Delegate.Invoke function so you can use delegates asynchronously, too.
-----BEGIN GEEK CODE BLOCK-----
GCS/G/MU d- s: a- C++++ UL@ P++(+++) L+(--) E--- W+++ N++ o+ K? w++++ O- M(+) V? PS-- PE Y++ PGP++ t++@ 5 X+++ R+@ tv+ b(-)>b++ DI++++ D+ G e++>+++ h---* r+++ y+++
-----END GEEK CODE BLOCK-----