2 Stimmen

Threads - ResetEvent und WebClient

Code:

    public string GetTextWebRequest(string url)
    {
        WebClient cl = new WebClient();
        cl.DownloadStringCompleted += new DownloadStringCompletedEventHandler(cl_DownloadStringCompleted);
        cl.DownloadStringAsync(new Uri(url));
        are.WaitOne();
        return _textdata;
    }

    void cl_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
    {
        _textdata = e.Result;
        are.Set();
    }

Warum verwende ich nicht die Methode "DownloadString"? Weil ich das kompakte Framework verwende und async die einzige Option ist, die ich habe.

Wie auch immer, mein Problem ist, dass "DownloadStringCompleted" nicht aufgerufen wird, wenn der Hauptthread (Aufruf) blockiert ist. Und wird daher nie wieder freigegeben.

Mein einziger Gedanke ist, dass der WebClient 'DownloadStringCompleted' auf dem aufrufenden Thread aufruft, was keinen Sinn macht?

Ich bin etwas ratlos.

1voto

Henk Holterman Punkte 249753

Mein einziger Gedanke ist, dass der WebClient 'DownloadStringCompleted' im aufrufenden dem aufrufenden Thread aufruft, was keinen Sinn macht?

Aber genau das ist der Fall. Es ist schlecht dokumentiert, aber diese Methode und dieses Ereignis folgen dem Backgroundworker-Modell. Sie können die Beziehung in den DownloadStringCompletedEventArgs Mitgliedern sehen.

Das Bgw-Muster wird an verschiedenen Stellen in der WinForms(-verwandten) Bibliothek verwendet. Siehe zum Beispiel das PictureBox-Steuerelement.

Die Schlussfolgerung lautet also: nicht blockieren... Sie müssen einen ereignisgesteuerten Ansatz entwerfen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X