I'd like to make the method as easy to use as possible. That means that anyone should be able to call it synchronously by accessing the Result member of the returned Task.
There is no easy way to create a synchronous wrapper for an asynchronous method. It's best to let asynchronous methods be asynchronous.
You can use ConfigureAwait(continueOnCapturedContext: false)
to discard the context, but it won't be any better than Task.Run
in your case since you can't change the methods that M
calls.