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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code