To level set, I've been working with OOP and FP for my whole career, so my experience with the imperative paradigm is limited. The team I joined is made up of very senior (20+ years xp) imperative programmers using a domain specific language - think Pascal. The team is challenged to try new things (not the focus of this question). I've been tasked to architect a system for an asynchronous problem.
Currently, the team uses something to the equivalent of
Thread.Sleep to handle the asynchronous bits, but that leads to all sorts of bugs.
From what I gather, since imperative programming works using step-by-step instructions, it appears that polling is probably the main way of solving asynchronous problems. In general, what are the other techniques used to solve asynchronous problems using an imperative paradigm?
I introduced the team other tools like callbacks, promises and events in the hopes that I can change the language, but unfortunately, they found it overwhelming. I'd like to build a system that plays to the team's strengths, but slowly nudges them in the direction to change how they approach asynchronous problems.