Add IAsyncComponent
to allow async initialize/terminate
#16536
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Prerequisites
Description
As mentioned in #16430 (comment), it's currently not possible to (correctly) use async methods in components. This adds
IAsyncComponent
and refactors the code to call theInitializeAsync()
/TerminateAsync()
methods instead, which does mean a breaking change in theComponentCollection
(the item type and methods have changed). I did makeIComponent
inherit fromIAsyncComponent
and added default interface methods, so any existing (synchronous) components are still backwards compatible.I've also added 2 base classes to make usage easier:
AsyncComponentBase
- this only initializes/terminates when the application isn't restarting (aka the actual start/stop of the application) and implements a no-opTerminateAsync()
method (as most implementations only require initialization);RuntimeAsyncComponentBase
- inheriting fromAsyncComponentBase
and also takes the runtime level into account, so it only initializes/terminates when the application is running normally.I'll add some example components to help test later...