Laden...

C# WebClient Download blockiert Windows Forms

Letzter Beitrag vor einem Jahr 7 Posts 831 Views
C# WebClient Download blockiert Windows Forms

Hallo,

ich möchte Daten von meinem Server auslesen. Solange der Server verfügbar ist, stellt dies auch kein Problem dar. Allerdings kommen die ersten Probleme sobald der Server nicht erreichbar ist, bspw beim Restart oder Shutdown. Ist solch ein Fall eingetreten wird die Form für kurze Zeit blockiert. Gibt es eine Möglichkeit das Blockieren zu verhindern sofern er nicht sofort Daten vom Server erhält ?

Folgenden Code habe ich

public class WebClientWithTimeout : WebClient
        {
            public int Timeout { get; set; } = 1000; //10 secs default

            //for sync requests
            protected  override WebRequest GetWebRequest(Uri uri)
            {
                var w = base.GetWebRequest(uri);
                w.Timeout = Timeout; //10 seconds timeout
                return w;
            }

            //the above does not work for async requests, lets override the method
            public new async Task<string> DownloadStringTaskAsync(Uri address)
            {
                return await RunWithTimeout(base.DownloadStringTaskAsync(address));
            }

            public new async Task<string> UploadStringTaskAsync(string address, string data)
            {
                return await RunWithTimeout(base.UploadStringTaskAsync(address, data));
            }

            private async Task<T> RunWithTimeout<T>(Task<T> task)
            {
                if (task == await Task.WhenAny(task, Task.Delay(Timeout)))
                    return await task;
                else
                {
                    this.CancelAsync();
                    throw new TimeoutException();
                }
            }
        }
WebClient client = new WebClientWithTimeout();
string strPageCode = client.DownloadString(Url + "haltestellen_daten&kurs=" + id);

Über jede Hilfe wäre ich dankbar.

Liebe Grüße

Verwende den HttpClient mit dessen asynchronen Methoden.
Der WebClient ist seit Jahren obsolete.

Und Dein Async-Konstrukt ist eher semi-gut.
Brauchst aber eh alles nicht, wenn Du einfach HttpClient verwendest.

Hallo und vielen Dank für deine Antwort. Leider besteht das Problem weiterhin trotz dass ich es bisher umgeschrieben habe.

Ich habe es nun wie folgt umgeschrieben

public async Task<string> DownloadString(string url)
{
	HttpClient httpClient = new HttpClient();
	string content = await httpClient.GetStringAsync(url);
	return content;
}
private async Task<bool> MacCheckAsync()
{
	try
	{
		string LizenzAbfrage = await DownloadString(Url + "haltestellen_daten&kurs=" + id);
	}
	catch
	{
		return
	}
}

Wie rufst du DownloadString denn auf?

Wenn du das korrekt mit await machst, sollte das deine UI nicht blockieren.

Ah ich habe zumindest vergessen den DownloadString mit zu posten.

Daten senden tuh ich ja hier wie folgt.

So lange der Server Online ist, stellt alles kein Problem dar. Sobald dieser aber Offline ist, verzögert das ganze kurzzeitig ca 1 Sekunde.

Ich habe mal dazu ein Video gemacht

https://youtube.com/shorts/sOsCKcjGi-8?feature=share

string LizenzAbfrage = await DownloadString(Url + "haltestellen_daten&kurs=" + id);
public async Task<string> DownloadString(string url)
{
	HttpClient httpClient = new HttpClient();
	string content = await httpClient.GetStringAsync(url);
	return content;
}

Ah klappt doch alles wie gewollt, hab vergessen ein paar Abfragen richtig abzuändern.

Da saß das Problem vor dem Monitor.

Danke für den Tipp

So wie Du den HttpClient verwendest, zeigt das, dass Du die Doku dazu nicht gelesen haben kannst.
Solltest nachholen, vor allem bei Klassen, die neu für einen sind. Immer hilfreich, wenn man dazu lernen will 😉