private async void StartFoo() { await Task.Factory.StartNew(() => { while (State != FooState.Finished) { IResult result = CurrentBar.WaitForValue(); // This is blocking function, wait for a value OnValueInjected?.Invoke(this, new ResultEventArgs(result)); AutoReset.Set(); // .. rest of the loop } }); }