In the previous chapters, we already discussed how important it is to use asynchronous input/output operations properly. Why does it matter so much? To have a solid understanding, let us consider two kinds of applications.
If we run an application on the client, one of the most important things is to have a responsive user interface. This means that no matter what is happening with the application, all user interface elements, such as buttons and progress bars, keep running fast, and the user gets an immediate reaction from the application. This is not easy to achieve! If you try to open the notepad text editor in Windows and try to load a text document that is several megabytes in size, the application window will be frozen for a significant amount of time because the whole text is being loaded from the disk first, and only then the program starts to process user input.
This is an extremely important issue, and in this situation, the only solution is to avoid blocking the UI...