it seems perfectly reasonable to want to offload I/O bound work and let the current thread do some other work, in contexts that are not UI based.
If this is a non-UI thread, and you do have some other work to do while your IO-bound operation is pending, then nothing prevents your from doing so inside your synchronous method:
public void ProcessOrder()
{
// other stuff...
// initiate the IO-bound operation
var task = _publisher.PublishAsync(new ItemOrderedEvent() {});
{
MessageId = Guid.NewGuid(),
IsDurable = true,
}); // do not call .Wait() here
// do your work
for (var i = i; i < 100; i++)
DoWorkItem(i);
// work is done, wait for the result of the IO-bound operation
task.Wait();
}
This might make sense if you cannot afford re-factoring all of your code to use "async all the way down" philosophy (which may be time-consuming, but almost always possible).