I understand that the Task-based Asynchronous Pattern (TAP) is now the preferred way to write async code but I was reading up on previous patterns to see how async code used to be written.
When writing BeginXXX methods, was there any suggested way to do it or was it totally left up to the implementor of the method?
I found some cases where tasks are used but my understanding is that Tasks were introduced with the TPL in .NET Framework 4. So before that, did BeginXXX calls call BeginInvoke on some delegate (which I guess kicks off a ThreadPool thread?) or did classes just use ThreadPool directly, or something else, or a mix, etc.?