public Task FireAsync <TArgument>(ParameterizedTrigger <TTrigger, TArgument> parameterizedTrigger, TArgument argument) { return(!IsEnabled ? Task.FromResult(false) : RunOnScheduler(() => machine.FireInternalAsync(parameterizedTrigger, argument))); }
public async Task FireAsync <TArgument>(ParameterizedTrigger <TTrigger, TArgument> parameterizedTrigger, TArgument argument) { if (!IsEnabled) { return; } var flag = true; queueMonitor.Enter(); if (machine.Monitor.TryEnter()) { if (queueCount == 0) { queueMonitor.Exit(); flag = false; try { await machine.FireInternalAsync(parameterizedTrigger, argument); } finally { queueMonitor.Enter(); if (queueCount > 0) { queueMonitor.Exit(); var _ = StartQueueIfNecessaryAsync(true); // Should not exit monitor here. Its handled by the process queue. } else { queueMonitor.Exit(); machine.Monitor.Exit(); } } } } if (flag) { var tcs = new TaskCompletionSource <bool>(); actionsQueue = actionsQueue.Enqueue(async() => { try { await machine.FireInternalAsync(parameterizedTrigger, argument); tcs.TrySetResult(true); } catch (Exception ex) { tcs.TrySetException(ex); } }); queueCount++; queueMonitor.Exit(); var _ = StartQueueIfNecessaryAsync(); await tcs.Task; } }