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?
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 usarco_await
dentro de una función asíncrona que pueda ser llamada desdemain()
.Por ejemplo:
“`c++
winrt::Windows::Foundation::IAsyncAction RunAsync()
{
co_await ::WriteToFileAsync();
// otras operaciones asíncronas
}
int main()
{
winrt::init_apartment();
}
“`
De esta manera, cualquier operación asíncrona puede ser ejecutada concurrentemente sin bloquear el hilo principal.
RunAsync()
también puede contener múltiples declaracionesco_await
para otras operaciones asíncronas.