Neither of these options is correct. You’re trying to implement a synchronous interface asynchronously. Don’t do that. The problem is that when DoOperation()
returns, the operation won’t be complete yet. Worse, if an exception happens during the operation (which is very common with IO operations), the user won’t have a chance to deal with that exception.
What you need to do is to modify the interface, so that it is asynchronous:
interface IIO
{
Task DoOperationAsync(); // note: no async here
}
class IOImplementation : IIO
{
public async Task DoOperationAsync()
{
// perform the operation here
}
}
This way, the user will see that the operation is async
and they will be able to await
it. This also pretty much forces the users of your code to switch to async
, but that’s unavoidable.
Also, I assume using StartNew()
in your implementation is just an example, you shouldn’t need that to implement asynchronous IO. (And new Task()
is even worse, that won’t even work, because you don’t Start()
the Task
.)