private bool TryCooking() { Monitor.Enter(_kitchen._cookingLock); var ingredient = _kitchen.PeekNextIngredientToCook(); var retry = false; if (ingredient != null) { retry = true; if (!_kitchen.Owen.IsInUse) { var owen = _kitchen.Owen; Monitor.Enter(owen._lock); if (owen.PutIngredientIntoOwen(ingredient)) { _kitchen.GetIngredientToCook(); } else { StartOwen(); retry = false; } if (_kitchen.Owen.CurrentCount == Owen.Capacity) { StartOwen(); retry = false; } Monitor.Exit(owen._lock); } else { retry = false; } } else { if (_kitchen.Owen.CurrentCount > 0 && !_kitchen.Owen.IsInUse && !_kitchen.HasIngredientToPrepare()) { StartOwen(); } } Monitor.Exit(_kitchen._cookingLock); return(retry); }