c# - usar - ¿Cómo escribir el método asincrónico simple?
metodo asincronico c# (3)
Utilizando la última CTP5 con palabras clave async / await, escribí un código, que aparentemente no se puede compilar:
class Program
{
public class MyClass
{
async public Task<int> Test()
{
var result = await TaskEx.Run(() =>
{
Thread.Sleep(3000);
return 3;
});
return result;
}
}
static void Main(string[] args)
{
var myClass = new MyClass();
//The ''await'' operator can only be used in a method or lambda marked with the ''async'' modifier error ??!!
int result = await myClass.Test();
Console.ReadLine();
}
}
¿Cuál es la razón de que "el operador ''esperar'' solo pueda usarse en un método o lambda marcado con el error ''modificador asíncrono''?" (Seleccioné la línea a la que me apunta Visual Studio)
No sé si puede marcar Main como async, pero debe incluir la palabra clave async
en la declaración de cualquier método que utilice await
. Por ejemplo:
public async void DoStuffAsync ()
{
var myClass = new MyClass ();
int result = await myClass.TestAsync ();
}
await
no es lo mismo que Wait()
; hacer una await
es una reescritura significativa de ese método, y en particular afecta la expectativa de cómo ese método sale para la persona que llama. Tiene razón en que en realidad no hace mucho (advertencia: tipos de devolución) excepto decirle al compilador que habilite algunas cosas (como lo hacen los conmutadores como unsafe
, checked
y unchecked
si lo piensa), pero considere: esto realmente importa enormemente en tu ejemplo. Si Main()
sale (y no asumimos otros hilos) - you exe es brindis . Ido. Ya no existe. Agregar async
hace considerar que solo porque el método sale no significa que ha terminado . Realmente no quiere que Main()
salga antes de estar listo.
Como efecto secundario, este cambio también formaliza que el método solo puede devolver cosas como Task
; sin el interruptor, es posible que tengas la tentación de hacerlo asincrónico más tarde, lo que podría ser un cambio significativo.
Un método asíncrono puede tener un tipo de retorno de vacío o Tarea. Si el tipo de devolución no es nulo, la persona que llama puede seguir utilizando el mecanismo de Espera estándar introducido en .Net 4 dentro del método de entrada Principal (que no se puede marcar como sincronización). Aquí hay un ejemplo simple:
static void Main(string[] args)
{
string address = "http://api.worldbank.org/countries?format=json";
Task t = LoadJsonAsync(address);
// do other work while loading
t.Wait();
Console.WriteLine("Hit ENTER to exit...");
Console.ReadLine();
}
private async static Task LoadJsonAsync(string address)
{
HttpClient client = new HttpClient();
HttpResponseMessage response = await client.GetAsync(address);
// Check that response was successful or throw exception
response.EnsureSuccessStatusCode();
// Read response asynchronously as JsonValue and write out top facts for each country
JsonArray readTask = await response.Content.ReadAsAsync<JsonArray>();
Console.WriteLine("First 50 countries listed by The World Bank...");
foreach (var country in readTask[1])
{
Console.WriteLine(" {0}, Capital: {1}",
country.Value["name"],
country.Value["capitalCity"]);
}
}