In this chapter, we discussed further ways to improve our applications, making them as useful to the end users as possible. We investigated how we could implement a custom user feedback system to keep the users informed with the status of the operations that they perform.
We also examined how to make our applications asynchronous, so that our UI won't freeze when the application is performing long running operations. We then looked at one way of building this asynchronous behavior right into our application framework, so that we can run any data access operation asynchronously, with minimal code.
We ended with a short section dedicated to improving the way that our applications are perceived by the end users. In it, we detailed a number of ways of accomplishing this, from providing in-application help and user preferences to paying attention to the smaller details and implementing work-heavy functions to save the users from having to manually do the same.
In the next chapter, we'll...