In mijn C# applicatie maak ik gebruik van multithreading.
Dit omdat als ik download anders mijn gehele applicatie bevriest.
Voor de file handling gebruik ik de System.Net class
Nu wil ik graag, d.m.v multithreading dus , zorgen dat ik 2 bestanden tegelijk kan downloaden.
Anders had een gewone thread dus wel volstaan in mijn applicatie.
Het punt is nu dat de 1e Thread start , maar de 2e Thread start pas nadat de 1e is afgelopen.
Hierdoor volgende de downloads elkaar op.
Maar wat ik wil is dus dat de downloads tegelijk starten.
Mijn vermoeden zegt dat dit probleem niet bij de Threads ligt , maar juist in de webRequest.
Hij start met de webrequest pas als de webResponse gesloten word.
Deze had ik namelijk eerst niet goed afgesloten , en dat gaf een WebException.
Als ik deze dus sluit aan het einde van de functie , dan werken de threads wel , maar volgen elkaar dus op.
Ik wil graag dat deze gelijktijdig lopen , zodat mijn downloads tegelijk binnen komen.
Het probleem is dus dat ik hier een beetje vastloop , en eigenlijk niet goed meer weet waar ik het moet zoeken.
Ik zit zelf te denken aan iedere keer dat de functie start , en compleet nieuwe webRequest aanmaken met een unieke waarde zodat ze gelijk tijdig kunnen lopen en niet op elkaar hoeven te wachten.
Klopt mijn redenatie? en zit ik in de goede richting?
Of is er misschien een andere oplossing m.b.t de filehandling?
Ter verduidelijking zal ik mijn functie waar het om gaat ook nog even posten
EDIT:
Ik maak iedere keer een nieuwe instantie van mijn download class aan.
Daarmee zou toch ook de webRequest iedere keer uniek moeten worden? , of zit ik nu helemaal verkeerd te denken
Dit omdat als ik download anders mijn gehele applicatie bevriest.
Voor de file handling gebruik ik de System.Net class
Nu wil ik graag, d.m.v multithreading dus , zorgen dat ik 2 bestanden tegelijk kan downloaden.
Anders had een gewone thread dus wel volstaan in mijn applicatie.
Het punt is nu dat de 1e Thread start , maar de 2e Thread start pas nadat de 1e is afgelopen.
Hierdoor volgende de downloads elkaar op.
Maar wat ik wil is dus dat de downloads tegelijk starten.
Mijn vermoeden zegt dat dit probleem niet bij de Threads ligt , maar juist in de webRequest.
Hij start met de webrequest pas als de webResponse gesloten word.
Deze had ik namelijk eerst niet goed afgesloten , en dat gaf een WebException.
Als ik deze dus sluit aan het einde van de functie , dan werken de threads wel , maar volgen elkaar dus op.
Ik wil graag dat deze gelijktijdig lopen , zodat mijn downloads tegelijk binnen komen.
Het probleem is dus dat ik hier een beetje vastloop , en eigenlijk niet goed meer weet waar ik het moet zoeken.
Ik zit zelf te denken aan iedere keer dat de functie start , en compleet nieuwe webRequest aanmaken met een unieke waarde zodat ze gelijk tijdig kunnen lopen en niet op elkaar hoeven te wachten.
Klopt mijn redenatie? en zit ik in de goede richting?
Of is er misschien een andere oplossing m.b.t de filehandling?
Ter verduidelijking zal ik mijn functie waar het om gaat ook nog even posten
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
| private void downloadPodCast() { using (WebClient wcDownload = new WebClient()) { try { // Create a request to the file we are downloading webRequest = (HttpWebRequest)WebRequest.Create(nodeTag); // Retrieve the response from the server webResponse = (HttpWebResponse)webRequest.GetResponse(); // Ask the server for the file size and store it Int64 fileSize = webResponse.ContentLength; // Open the URL for download strResponse = wcDownload.OpenRead(nodeTag); // Create a new file stream where we will be saving the data (local drive) try { strLocal = new FileStream(downloadFolder + title + "_-_" + desc + "_-_" + date + ".mp3", FileMode.Create, FileAccess.Write, FileShare.None); } catch (DirectoryNotFoundException) { Directory.CreateDirectory(downloadFolder); strLocal = new FileStream(downloadFolder + title + "_-_" + desc + "_-_" + date + ".mp3", FileMode.Create, FileAccess.Write, FileShare.None); } // It will store the current number of bytes we retrieved from the server int bytesSize = 0; // A buffer for storing and writing the data retrieved from the server byte[] downBuffer = new byte[10000]; // Loop through the buffer until the buffer is empty while ((bytesSize = strResponse.Read(downBuffer, 0, downBuffer.Length)) > 0) { // Write the data from the buffer to the local hard drive strLocal.Write(downBuffer, 0, bytesSize); // Invoke the method that updates the form's label and progress bar form.Invoke(new UpdateProgessCallback(this.UpdateProgress), new object[] { strLocal.Length, fileSize }); } } finally { // When the above code has ended, close the streams webResponse.Close(); strResponse.Close(); strLocal.Close(); } } } |
EDIT:
Ik maak iedere keer een nieuwe instantie van mijn download class aan.
Daarmee zou toch ook de webRequest iedere keer uniek moeten worden? , of zit ik nu helemaal verkeerd te denken
www.degroot-it.nl