https://en.wikipedia.org/wiki/Concurrent_Pascal
Simula,
https://en.wikipedia.org/wiki/Simula
And plenty of other ones,
C# really helped to popularized asyc/await as language feature, even though F# had something similar first.
It’s also possible to do async-like behaviour - without the async/await language feature - in C# using LINQ; so you could argue C# has had the capability (like F#) since LINQ was released.
But, I believe C# was the first mainstream language to implement the async/await method-splitting coroutines state-machine (as a language feature)
C#, and other languages that have taken the C# approach [to async/await], don't have first class continuations (well, C# does with LINQ, but that compromises most ways the average OO dev works). They implement async/await with first-class keywords that indicate where to slice a method in two.
In my language-ext [1] project I have added the LINQ operators to `Task<T>` which allows C# tasks to be used in the same way that Async is done in F#.
[1] https://github.com/louthy/language-ext/blob/main/LanguageExt...
Incidentally there are papers that are trying to improve on async in C++ by trying to sneak in generalized do-notation.