Poseemos la mejor solución que hemos encontrado on line. Nuestro deseo es que te resulte de utilidad y si puedes aportar algún detalle que nos pueda ayudar a crecer hazlo con total libertad.
Solución:
El tipo de retorno enumerado del método es Task
. Estás tratando de devolver un string
. No son lo mismo, ni hay una conversión implícita de string para Task
de ahí el error.
Es probable que estés confundiendo esto con un async
método en el que el valor de retorno se envuelve automáticamente en un Task
por el compilador. Actualmente ese método no es un método asíncrono. Es casi seguro que quisiste hacer esto:
private async Task methodAsync()
await Task.Delay(10000);
return "Hello";
Hay dos key cambios. Primero, el método está marcado como async
lo que significa que el tipo de retorno está envuelto en un Task
, haciendo que el método compile. A continuación, no queremos hacer una espera de bloqueo. Como regla general, cuando se utiliza el await
modelo evita siempre bloquear esperas cuando puedas. Task.Delay
es una tarea que se completará después del número especificado de milisegundos. Por await
Al realizar esa tarea, efectivamente estamos realizando una espera sin bloqueo durante ese tiempo (en realidad, el resto del método es una continuación de esa tarea).
Si prefieres una forma 4.0 de hacerlo, sin usar await
Puedes hacerlo:
private Task methodAsync()
return Task.Delay(10000)
.ContinueWith(t => "Hello");
La primera versión se compilará a algo que es más o menos como esto, pero tendrá un código repetitivo adicional para admitir el manejo de errores y otras funciones de await
no estamos aprovechando aquí.
Si tu Thread.Sleep(10000)
realmente está destinado a ser solo un marcador de posición para algún método de ejecución prolongada, en lugar de solo una forma de esperar por un tiempo, luego deberá asegurarse de que el trabajo se realice en otro hilo, en lugar del contexto actual. La forma más fácil de hacerlo es a través de Task.Run
:
private Task methodAsync()
return Task.Run(()=>
SomeLongRunningMethod();
return "Hello";
);
O más probable:
private Task methodAsync()
return Task.Run(()=>
return SomeLongRunningMethodThatReturnsAString();
);
Utilizar el método FromResult
public async Task GetString()
System.Threading.Thread.Sleep(5000);
return await Task.FromResult("Hello");
Más allá del uso problemático de async
como lo señaló @Servy, el otro problema es que necesita obtener explícitamente T
desde Task
llamando a Task.Result. Tenga en cuenta que la propiedad Result bloqueará el código asincrónico y debe usarse con cuidado.
Tratar:
private async void button1_Click(object sender, EventArgs e)
var s = await methodAsync();
MessageBox.Show(s.Result);