2016-05-03 19 views
0

Das Programm, das ich gerade erstelle, hat einige Pictureboxes. Die Bilder von diesen werden den Ressourcen nicht hinzugefügt, stattdessen möchte ich sie von einer Website laden. Es funktioniert soweit, das größte Problem ist, dass das Programm abstürzt, wenn es die Bilder nicht laden konnte. Ich suchte nach diesem Problem, und es scheint, dass die asynchronen Bilder der richtige Weg sind, um dieses Problem zu lösen.C# Laden von Bildern async

Derzeit ist dies die Art, wie ich die Bilder bin Laden:

private static Image GetImageFromURL(string url) 
{ 
    HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url); 
    HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
    Stream stream = httpWebReponse.GetResponseStream(); 
    return Image.FromStream(stream); 
} 

....

foo.Image = GetImageFromURL("https://foo.com/bar.jpg"); 

ich viele Threads auf SO und anderen Seiten gelesen habe, aber ich habe nicht noch verstehen asynchron. Ich hoffe wirklich, dass jemand hier versuchen kann zu erklären, wie man es benutzt, wenn async der richtige Weg ist.

Sorry für mein schlechtes Englisch, ich hoffe es ist nicht schwer zu verstehen.

+2

'" die Bilder asynchron zu bekommen wäre der richtige Weg, um dieses Problem zu lösen "' - Was lässt dich das denken? Zu bestimmen, warum die Anwendung fehlschlägt, scheint ein guter erster Schritt zu sein, um das zu verhindern, anstatt zufällige Änderungen vorzunehmen und auf das Beste zu hoffen. Sonst wird sich das gleiche Problem nur asynchron manifestieren. – David

+0

@David Es ist nicht so viel über den Absturz selbst. Ich hätte es vielleicht ein bisschen besser erklären sollen. Das Programm stürzt ab, wenn es keine funktionierende Verbindung zum Abrufen der Bilder gibt. Dies sollte einfach zu beheben sein. Der asynchrone Teil ist eher eine lange Ladezeit beim Starten des Programms zu lösen, wenn die Verbindung oder die Website langsam ist. – Backslash

+0

Das 'PictureBox'-Steuerelement verfügt über eine integrierte Unterstützung zum asynchronen Laden von Image aus einer URL. [Laden Sie ein Bild asynchron aus einer URL in eine PictureBox] (http://stackoverflow.com/questions/37763916/asynchron-load-an-image-from-a-url-to-a-picturebox) –

Antwort

1

Im Allgemeinen mit den integrierten .NET-Objekten (und hoffentlich per Konvention mit beliebigen Objekten) wird die "async" -Version verwendet, indem einfach die entsprechende Methode Async verwendet wird.

Zum Beispiel statt dessen:

HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse(); 

Sie hätte dies:

HttpWebResponse httpWebReponse = (HttpWebResponse)(await httpWebRequest.GetResponseAsync()); 

Notiere die Zugabe des Async auf dem Methodenaufruf, found here, sowie die Zugabe der await Schlüsselwort. Diese letzte Änderung würde auch eine Änderung der Methode Signatur erforderlich machen:

private static async Task<Image> GetImageFromURL(string url) 

Und jede Methode, die es so gut würde sich ändern müssen ruft:

Image someImage = await GetImageFromURL(someUrl); 

Der asynchrone Betrieb sollten als solche auch weiterhin alle Weg zur obersten Ebene. (Die übliche Art dies zu sagen ist, dass es "async den ganzen Weg hinunter" sein sollte.)

Sobald die Methode async ist, können Sie so viele await Operationen darin haben, wie Sie möchten. Einige der anderen Methoden, die Sie gerade anrufen, können auch Async Äquivalente haben, so dass Sie das gleiche mit ihnen tun können.

+0

Das macht alles a ein bisschen klarer. Um GetImageFromURL zu verwenden, muss ich es in einer asynchronen Methode haben, oder? – Backslash

+0

@Backslash: Richtig. Die zugrunde liegenden asynchronen Vorgänge sollten bis zur Ebene des Anwendungshosts verfügbar sein, damit sie entsprechend behandelt werden können. Verstecke niemals eine asynchrone Operation hinter einer synchronen Schnittstelle, die die Tür zu allen Arten von schwer zu findenden Fehlern öffnen würde. – David

+0

Danke, alles funktioniert jetzt und ich denke, ich verstehe das meiste davon! :) – Backslash