2012-09-22 16 views
7

tengo esta línea de código:¿Por qué aparece una advertencia del compilador cuando uso ContinueWith?

t.ContinueWith(_ => form.Close(), 
        TaskScheduler.FromCurrentSynchronizationContext()); 

... sobre la que el compilador tiene esto que decir:

Advertencia 2 Debido a que esta llamada no se esperaba, la ejecución del método actual continúa antes la llamada se completa. Considere la posibilidad de aplicar el operador 'esperar' al resultado de la llamada.

Ahora bien, este no era el código que escribí, pero pensé que simplemente se agrega una continuación al final de una tarea existente. No pensé que en realidad es ejecutando la tarea (o la continuación). ¿Entonces seguramente este proceso de simplemente modificar la tarea es una operación sincrónica? ¿Por qué debería tener que await?

+0

Can I Haz Suround Coud? –

+0

¿Podría publicar todo el método? –

+1

Stephen, es su código :-) Consulte http://stackoverflow.com/a/12513296/98422 –

Respuesta

8

¿Por qué debería tener que await él?

No es necesario que await, por eso es una advertencia, no es un error. Pero, si está en un método async y tiene un método que devuelve un objeto que se puede esperar, la mayoría de las veces, no debe ignorarlo.

En el código síncrono normal, no tiene que hacer nada especial para esperar hasta que se complete un método al que llamó, cada llamada al método siempre bloquea. Pero con los métodos asíncronos, en realidad tienes que await si quieres esperar hasta que se completen. Además, si la operación asíncrona falla y arroja una excepción, no sabrá hasta que await el resultado del método (u obtenga la excepción del resultado de otra manera, como llamar al Wait() si el awaitable es un Task) .

Por lo tanto, si ignora un valor devuelto en un método async, es probable que tenga un error en su código, que es lo que la advertencia está tratando de evitar.

En su caso ContinueWith(), devuelve un Task, que puede serawait ed, por lo que el compilador supone que debe await ella. Pero en este caso, no desea esperar hasta que se complete la continuación y muy probablemente Close() no lanzará una excepción. Entonces, en este caso, la advertencia es un falso positivo, en realidad no indica un problema en el código.

+0

Gran respuesta, gracias. ¿Hay algo que pueda hacer para evitar que aparezca la advertencia, y así oscurecer todos los problemas _actuales_? (No quiero desactivar la advertencia en otros casos, solo aquí). –

+3

Puede desactivarlo solo para este método si agrega '#pragma warning disable 4014' antes del método y' #pragma warning restore 4014' después de él.Por lo general, te recomendaría que arreglaras de qué se queja la advertencia, pero en este caso, realmente no hay nada que arreglar, por lo que desactivar la advertencia solo para este método tiene sentido, creo. – svick

+1

Otra opción es asignar la tarea a una variable. Y luego simplemente ignora la variable. – wasabi

Cuestiones relacionadas