Considere el siguiente fragmento de código:¿Cómo crear un método asíncrono en C# 4 de acuerdo con las mejores prácticas?
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;
});
}
debe devolver Task<string>
, enviar solicitud HTTP POST con algunos datos, devuelve un resultado de servidor web en una forma de cadena y ser lo más eficiente posible.
- ¿Ha detectado algún problema relacionado con el flujo asíncrono en el ejemplo anterior?
- ¿Está bien tener .Wait() dentro .ContinuarCon() en este ejemplo
- ¿Ve algún otro problema con esta paz de código (dejando de lado el manejo de excepciones por ahora)?
Debe aceptar algunas respuestas de sus otras preguntas – Jimmy
Es posible que desee considerar cambiar el nombre de su objeto Task ya que hay un objeto Task en .NET 4. Si bien puede hacer que funcionen juntos, puede ser más fácil simplemente cambiar su nomenclatura. –
Mystere Man, no tengo ninguna declaración personalizada de tareas. El tipo de tarea que estoy usando proviene de .NET 4.0 BCL. –