with winform pasar form example ejecutar desde consola como comandos c# asynchronous webclient windows-console

c# - winform - Finalización de la aplicación de la consola antes de la finalización de la llamada asíncrona



ejecutar comandos cmd desde c# (4)

Actualmente estoy escribiendo una aplicación de consola C # que genera una serie de URL que apuntan a diferentes imágenes en un sitio web y luego se descarga como secuencias de bytes mediante WebClient.DownloadDataAsync() .

Mi problema es que una vez que se realiza la primera llamada asincrónica, la aplicación de la consola considera que el programa se complete y finaliza antes de que la llamada asincrónica pueda regresar. Al usar Console.Read() puedo forzar que la consola permanezca abierta, pero esto no parece muy bueno. Además, si el usuario ingresa durante el proceso (mientras la consola está esperando la entrada), el programa terminará.

¿Hay alguna manera mejor de evitar que se cierre la consola mientras espero que vuelva una llamada asíncrona?

Editar: las llamadas son asincrónicas porque estoy proporcionando un indicador de estado a través de la consola para el usuario mientras se realizan las descargas.


Debe indicarse que en C # 7.1 Main ahora se puede marcar como async .

static async Task Main() { await LongRunningOperation(); }


Otra opción es simplemente llamar a un método principal asincrónico y esperar la tarea devuelta.

static void Main(string[] args) { MainAsync(args).Wait(); } static async Task MainAsync(string[] args) { // .. code goes here }

Desde .NET 4.5 ahora puede llamar a GetAwaiter().GetResult()

static void Main(string[] args) { MainAsync(args).GetAwaiter().GetResult(); }

¿Cuál es la diferencia entre .Wait () frente a .GetAwaiter (). GetResult ()?


Sí. Utilice un ManualResetEvent y tenga el event.Set() llamada de devolución de llamada event.Set() . event.Set() . Si la rutina principal bloquea en event.WaitOne() , no saldrá hasta que se complete el código async.

El pseudocódigo básico se vería así:

static ManualResetEvent resetEvent = new ManualResetEvent(false); static void Main() { CallAsyncMethod(); resetEvent.WaitOne(); // Blocks until "set" } void DownloadDataCallback() { // Do your processing on completion... resetEvent.Set(); // Allow the program to exit }


Si eso es todo lo que está haciendo su aplicación, le sugiero que omita la llamada asíncrona; específicamente desea que la aplicación se "cuelgue" hasta que se complete la descarga, por lo que usar una operación asincrónica es contrario a lo que quiere aquí, especialmente en una aplicación de consola.