My opinion is: all asynchronous calls dominated well threading was not introduced or well established. I don't see situation when those could beat threads. Threads are easier to implement as in a single thread all logic is sequential, they are well equipped with thread synchronization primitives and are ultimately more reliable is used properly.
The relatively costly operation of thread creation could be compensated by using thread pools or, better yet, by using "permanent threads" (threads with life time nearly the same of that of the whole process) throttled by thread synchronization and reused for repeated task.
I offer a very regular way of such throttling via a blocking message queue; see my Tips/Trick article:
Simple Blocking Queue for Thread Communication and Inter-thread Invocation[
^].
Please take a look at my past solutions on this and related topics:
How to get a keydown event to operate on a different thread in vb.net[
^],
Control events not firing after enable disable + multithreading[
^].
—SA