ImplementationGenerally speaking, blocking calls should be replaced with non-blocking alternatives that can be used asynchronously. Expensive computations should be passed off to worker threads, although the correct approach depends on the framework being used.
ImplementationFor expensive computations, consider breaking them up into multiple smaller computations. Refer to the documentation of the framework being used for guidance.