Voor een leuk projectje maak ik een download applicatie zoals je vroeger GetRight had. Dus meerdere segmenten(threads) die 1 file downloaden en zodoende sneller je download binnen halen. Nu heb ik al veel gevonden en ook al wat werkend. Inweze heb ik ook al op de codeproject een werkende versie gevonden maar voor m'n eigen ego wil ik toch dit probleem oplossen.
Wat is er nl. aan de hand, de threads lopen niet asynchroon omdat de eerste thread alle prioriteit op eist. Zodoende worden alle segmenten achter elkaar gedownload en niet tegerlijkertijd. Ik heb al in het voorbeeld van de codeproject zitten zoeken wat deze anders doet maar ik doe nagenoeg het zelfde. Wat snippets uit mijn code:
Ik heb ook al eens geprobeerd de response niet te doen en gewoon een teller vol te laten lopen. Dit ging dus wel naast elkaar. Het zit dus volgens mij echt in het ophalen van de stream (dit gebeurt in CreateStream). Mocht iemand wat weten dan bedankt wat ik snap er niks van waarom het niet werkt.
Wat is er nl. aan de hand, de threads lopen niet asynchroon omdat de eerste thread alle prioriteit op eist. Zodoende worden alle segmenten achter elkaar gedownload en niet tegerlijkertijd. Ik heb al in het voorbeeld van de codeproject zitten zoeken wat deze anders doet maar ik doe nagenoeg het zelfde. Wat snippets uit mijn code:
C#:
1
2
3
4
5
6
7
8
| // Alle threads opstarten, bekend is dan hoe groot de segmenten zijn // hier is ook niet veel mis mee. foreach (SegmentDownloader ss in Segments) { Thread t = new Thread(new ParameterizedThreadStart(ss.DownloadSegment)); t.Start(this); } |
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
| // Het downloaden van een segment (wat gestript) public void DownloadSegment(object o) { StreamDownloader parent = o as StreamDownloader; long currentPosition = 0; try { // tot op hier loopt alles nog naast elkaar using(Stream response = parent.DownloadProvider.CreateStream(RemoteFile, StartBytes, StartBytes+ReadBytes)) { int bytesRead = 0; byte[] buffer = new byte[bufferSize]; currentPosition = StartBytes; do { bytesRead = response.Read(buffer, 0, bufferSize); OutputStream.Position = currentPosition; OutputStream.Write(buffer, 0, bytesRead); currentPosition += bytesRead; fd.CurrentBytes = TotalBytesRead; OnBytesReveived(fd); TotalBytesRead += bytesRead; } while (bytesRead > 0 && TotalBytesRead < ReadBytes); } } catch (Exception exc) { throw exc; } finally { OutputStream.Close(); } } |
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| /// Het ophalen van de stream
public virtual Stream CreateStream(RemoteFileInfo rfi, long initialPosition, long endPosition)
{
HttpWebRequest request = (HttpWebRequest)GetRequest(rfi.Url);
if (initialPosition > 0)
{
request.AddRange((int)initialPosition);
}
WebResponse response = request.GetResponse();
return response.GetResponseStream();
} |
Ik heb ook al eens geprobeerd de response niet te doen en gewoon een teller vol te laten lopen. Dit ging dus wel naast elkaar. Het zit dus volgens mij echt in het ophalen van de stream (dit gebeurt in CreateStream). Mocht iemand wat weten dan bedankt wat ik snap er niks van waarom het niet werkt.