I am working with some code, where I have 2 classes with very similar logic and code. I have protected async void LoadDataAsync()
method on both classes.
Currently I am refactoring it and thinking to move shared logic to base class.
Is it OK to have virtual async
method on base class and override it on derived classes?
Are there any issues with it?
My code looks like this:
public class Base
{
protected virtual async void LoadDataAsync() {}
}
public class Derived : Base
{
protected override async void LoadDataAsync()
{
// awaiting something
}
}
Similar (but not same) question was already asked.
Short answer
virtual
method may be marked asasync
abstract
method cannot be marked asasync
The reason for this is
async
is not actually part of the method signature. It simply tells the compiler how to handle the compilation of the method body itself (and does not apply to overriding methods). Since an abstract method does not have a method body, it does not make sense to apply theasync
modifier.Long answer
Rather than your current signature in the base class, I would recommend the following if the base class provides a default implementation of the method but does not need to do any work.
The key changes from your implementation are the following:
void
toTask
(rememberasync
is not actually part of the return type). Unlike returningvoid
, when aTask
is returned calling code has the ability to do any of the following:async
modifier, since the method does not need toawait
anything. Instead, simply return an already-completedTask
instance. Methods which override this method will still be able to use theasync
modifier if they need it.Agree with @Sam.
I throw exception just to ensure that actual logic is implemented. Better fits my requirement, that's all.
Yes, it's fine, but you should use
async Task
instead ofasync void
. I have an MSDN article that explains why.