Saltar al contenido

No se puede convertir implícitamente el tipo ‘string’ a ‘System.Threading.Tasks.Task’

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 Taskde 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 asynclo 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 awaitAl 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);

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *