Nach dem Lesen von this Post vor ein paar Monaten, wurde ich paranoid von der Result
eines Task<T>
bekommen und unaufhörlich alle meine Anrufe mit einer ConfigureAwait(false)
oder Task.Run
umwickelt. Doch aus irgendeinem Grund beendet der folgende Code erfolgreich:Warum ruft Task <T> .Result Deadlock nicht auf?
public static void Main(string[] args)
{
var arrays = DownloadMany();
foreach (var array in arrays);
}
IEnumerable<byte[]> DownloadMany()
{
string[] links = { "http://google.com", "http://microsoft.com", "http://apple.com" };
using (var client = new HttpClient())
{
foreach (var uri in links)
{
Debug.WriteLine("Still here!");
yield return client.GetByteArrayAsync(uri).Result; // Why doesn't this deadlock?
}
}
}
Die Code druckt Still here!
3 mal und dann beendet. Ist das spezifisch für HttpClient
, dass es sicher ist, Result
anzurufen (wie in den Leuten, die es geschrieben haben, hat es mit ConfigureAwait(false)
gepfeffert)?
übrigens .. es ist viel einfacher, nicht zu blockieren und zu verwenden, wo erforderlich zu warten, als 'ConfigureAwait' überall zu verwenden. – i3arnon
@ i3arnon Wahr, aber ich schreibe eine API, die sowohl synchrone als auch asynchrone Aufrufe unterstützt. –
@JamesKo: Ich empfehle, dass asynchrone Methoden asynchrone APIs verfügbar machen. Wenn Sie * jedoch * sowohl Synchronisierung als auch Async unterstützen müssen (z. B. aus Gründen der Abwärtskompatibilität), finden Sie möglicherweise meinen letzten [MSDN Artikel auf Brownfield Async] (https://msdn.microsoft.com/en-us/magazine/ mt238404.aspx) nützlich. –