Autor Beitrag
Findus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Mi 24.12.08 16:34 
user profile iconChristian S. hat folgendes geschrieben Zum zitierten Posting springen:
Den Writer lässt Du einfach weg und da, wo Du im Moment noch bw.Write aufrufst, rufst Du stattdessen fs.WriteByte auf.

Den Reader lässt Du auch weg, und schnappst Dir stattdessen direkt den RepsonseStream (Stream resp = hwrs.GetResponseStream();) Der hat dann die Methode ReadByte.


OK Christian, soweit hoffe ich klar. Nun passiert folgendes: Beim Download läuft durch und dann bleibt er hängen bis ein Fehler durch Application.DoEvents(); kommt .. Schau ich mir den Inhalt nun an ist das File um ein vielfaches größer weil noch lauter:

ausblenden Quelltext
1:
2:
3:
4:
˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙
˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙
˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙
˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙˙

geschieben wurde.


Mein backgroundWorker1_DoWork Methode sieht nun so aus.
ausblenden volle Höhe C#-Quelltext
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 backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            //  der Worker wird später benötigt    
            BackgroundWorker worker = sender as BackgroundWorker;

            //  Den Dateiabruf vorbereiten. 
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"URL/temp.csv");
            request.Method = "GET";
            HttpWebResponse hwrs = (HttpWebResponse)request.GetResponse();
            FileStream fs = new FileStream(@"temp.csv", FileMode.Create, FileAccess.Write);

            //  Berechne die Dateigrößen und den Abschnitt 
            long summary = hwrs.ContentLength;
            int section = (int)summary / 100;
            int progress = 0;
            int counter = 0;

            Stream data = hwrs.GetResponseStream();

            try
            {
                while (true)
                {
                    // Hier download starten
                    fs.WriteByte((byte)data.ReadByte());
                    //  Bytes zählen
                    counter++;
                    //  den Arbeitsfortschritt anzeigen
                    if (counter >= section)
                    {
                        worker.ReportProgress(++progress, summary);
                        counter = 0;
                    }
                    // Prüfen ob Cancel Button gedrückt wird.
                    if (worker.CancellationPending)
                    {
                        e.Cancel = true;
                    }
                }
            }
            catch
            {
            }
            finally
            {
                //  Alle Streams müssen geschlossen werden
                fs.Close();
                hwrs.Close();
            } 
        }


Merry Christmas

Findus


Zuletzt bearbeitet von Findus am Do 25.12.08 11:18, insgesamt 1-mal bearbeitet
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 24.12.08 17:28 
Bei einer Endlosschleife ist auch eine unendlich große Datei kein (Weihnachts-)Wunder :D . Im Gegensatz zum StreamReader wirft MemoryStream.ReadByte keine Exception am Ende:
Zitat:
Return Value
Type: System.Int32

The byte cast to a Int32, or -1 if the end of the stream has been reached.

Wenn ReadByte also -1 zurückliefert, musst du die Schleife mit breakverlassen.

_________________
>λ=
Findus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 25.12.08 00:02 
Also ich fummel da nun schon ewig rumm. Ich bekomm das einfach nicht gebacken. Man sollte denken das doch ein Ausstieg auch mit folgendem Code möglich sein sollte.

ausblenden volle Höhe C#-Quelltext
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:
...

            //  Berechne die Dateigrößen und den Abschnitt 
            long summary = hwrs.ContentLength;
            int section = (int)summary / 100;
            int progress = 0;
            int counter = 0;

            Stream data = hwrs.GetResponseStream();

            try
            {
                while (true)
                {
                    // Hier download starten
                    fs.WriteByte((byte)data.ReadByte());

                    if (counter == summary)
                    {
                        break;
                    }

                    //  Bytes zählen
                    counter++;
                    
                    //  den Arbeitsfortschritt anzeigen 
                    if (counter >= section)
                    {
                        worker.ReportProgress(++progress, summary);
                        counter = 0;
                    } 
                                        
                    // Prüfen ob Cancel Button gedrückt wird.
                    if (worker.CancellationPending)
                    {
                        e.Cancel = true;
                    }
                }

...


Das mit dem ReadByte -1 versteh ich zwar aber kann es trotz vielen lesens nicht umsetzen. Vielleicht will mir da ja noch jemand helfen ;)

Gruß Findus
Findus Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Do 25.12.08 18:03 
Da sich das eigentliche Problem mit der blockierenden GUI ja erledigt hat betrachte ich diese Frage mal als beantwortet.

Gruß Findus