es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

C++/WinRT utilizando co_await en main()

En un proyecto de Windows Console Application (C++/WinRT), el punto de entrada es simplemente la función estándar int main().

Entonces, ¿cómo puedo empezar con el código asíncrono?

Por ejemplo, quiero llamar a un método

c++
winrt::Windows::Foundation::IAsyncAction WriteToFileAsync()
{
// llama a FileIO::WriteTextAsync, etc.
}

desde main.


No se puede utilizar co_await, es decir,

“`c++
int main()
{
winrt::init_apartment();

<pre><code>co_await ::WriteToFileAsync();
</code></pre>

}

<pre><code><br />produce el error

> la función "main" no puede ser una coroutine

<hr>

¿Debo utilizar entonces

“`c++
int main()
{
winrt::init_apartment();

::WriteToFileAsync().get();
}

en su lugar?

¿Hay una manera mejor en general?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, puedes usar el método get() para esperar a que la operación asíncrona se complete. Sin embargo, esto bloqueará el hilo principal y puede resultar en un rendimiento deficiente. Un enfoque mejor sería usar co_await dentro de una función asíncrona que pueda ser llamada desde main().

    Por ejemplo:

    “`c++
    winrt::Windows::Foundation::IAsyncAction RunAsync()
    {
    co_await ::WriteToFileAsync();
    // otras operaciones asíncronas
    }

    int main()
    {
    winrt::init_apartment();

    auto asyncOperation = RunAsync();
    
    // continuar con otras operaciones síncronas
    // ...
    
    asyncOperation.get();
    

    }
    “`

    De esta manera, cualquier operación asíncrona puede ser ejecutada concurrentemente sin bloquear el hilo principal. RunAsync() también puede contener múltiples declaraciones co_await para otras operaciones asíncronas.

Comments are closed.