Tenir compte de l'extrait de code suivant:Comment créer une méthode asynchrone en C# 4 selon les meilleures pratiques?
public static Task<string> FetchAsync()
{
string url = "http://www.example.com", message = "Hello World!";
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = WebRequestMethods.Http.Post;
return Task.Factory.FromAsync<Stream>(request.BeginGetRequestStream, request.EndGetRequestStream, null)
.ContinueWith(t =>
{
var stream = t.Result;
var data = Encoding.ASCII.GetBytes(message);
Task.Factory.FromAsync(stream.BeginWrite, stream.EndWrite, data, 0, data.Length, null, TaskCreationOptions.AttachedToParent)
.ContinueWith(t2 => { stream.Close(); });
})
.ContinueWith<string>(t =>
{
var t1 =
Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null)
.ContinueWith<string>(t2 =>
{
var response = (HttpWebResponse)t2.Result;
var stream = response.GetResponseStream();
var buffer = new byte[response.ContentLength > 0 ? response.ContentLength : 0x100000];
var t3 = Task<int>.Factory.FromAsync(stream.BeginRead, stream.EndRead, buffer, 0, buffer.Length, null, TaskCreationOptions.AttachedToParent)
.ContinueWith<string>(t4 =>
{
stream.Close();
response.Close();
if (t4.Result < buffer.Length)
{
Array.Resize(ref buffer, t4.Result);
}
return Encoding.ASCII.GetString(buffer);
});
t3.Wait();
return t3.Result;
});
t1.Wait();
return t1.Result;
});
}
Il devrait revenir Task<string>
, envoyer la demande HTTP POST avec des données, le retour d'un résultat de serveur web sous une forme de ficelle et être le plus efficace possible. Avez-vous détecté des problèmes concernant le flux asynchrone dans l'exemple ci-dessus?
- Avez-vous détecté des problèmes concernant le flux asynchrone dans l'exemple ci-dessus?
- Est-il correct d'avoir .Wait() dans .ContinueWith() dans cet exemple
- Voyez-vous d'autres problèmes avec cette paix de code (en mettant de côté la gestion des exceptions pour le moment)?
Vous devez accepter certaines réponses de vos autres questions – Jimmy
Vous pouvez envisager de renommer votre objet Tâche car il existe déjà un objet Tâche dans .NET 4. Bien que vous puissiez les faire fonctionner ensemble, il peut être plus facile de simplement changer votre nomenclature. –
Mystere Man, je n'ai aucune déclaration de tâche personnalisée. Le type de tâche que j'utilise provient de .NET 4.0 BCL. –