As we discussed through Part I, co_wait keyword requires sort of “resumable thing”. So what if we want to use co_await with time delta?
For example, you can see the code which the co_await takes std::chrono::duration in order to suspend for the specified time from here: https://github.com/Microsoft/cppwinrt/blob/master/10.0.14393.0/Samples/JustCoroutines/Main.cpp#L31
The answer is the fact that vc++ compiler allows co_await to be overloaded. So, we can overload the co_await keyword and returns the “resumable thing” within the overloading implementation.
If you follow the resume_after(), then you’ll clearly see it actually returns the instance of resumable thing struct which contain implementations of await_ready, await_suspend, and await_resume.
Let’s test with another test sample here. https://github.com/heejune/wrl-cppwinrt-sample/blob/async-support/SampleLib.Shared/DemoCore.cpp#L81
In this sample, I called the winrt’s co_await as the above sample illustrated.
And if I step into the co_await… we hit the overloaded co_await.
Step in again, then finally it creates resume_after struct instance and calls the await_suspend.
It spawns timer thread with specified time, and finally resume_after::callback static callback is being called.
The callback will finally call resume().
And the resume() transfers its context into where the co_await being called.
And lastly, the coroutine function hits the co_return keyword after looping 5 times,
And reached the end.
Next time, I’d like to talk about another co_await adapter ‘await_adapter’ which makes winrt IAsync.. types possible to be awaitable. Thanks.