6601c8ea22
- Update MenuUIViewModel with IMenuRestartSignal dependency and Restart() method - Add RestartButton to MenuUIView with listener management in Initialize/Release - Connect MenuUIView click handler to ViewModel.Restart() callback - Fix race condition in MenuRestartSignal.RequestRestart() by nulling completion source first - Wrap MenuState.WaitAsync() in try-catch for proper view cleanup on cancellation - Update TASK-0006 status to Ready Выполнена задача TASK-0006: реализована кнопка Restart и координация сигналов - Обновлён MenuUIViewModel с зависимостью IMenuRestartSignal и методом Restart() - Добавлена кнопка RestartButton в MenuUIView с управлением слушателями в Initialize/Release - Подключен обработчик кликов MenuUIView к колбэку ViewModel.Restart() - Исправлено состояние гонки в MenuRestartSignal.RequestRestart() путем обнуления completion source - Обёрнут WaitAsync в MenuState в try-catch для корректной очистки view при отмене - Обновлён статус TASK-0006 до Ready
44 lines
1.1 KiB
C#
44 lines
1.1 KiB
C#
using System;
|
|
using System.Threading;
|
|
using Cysharp.Threading.Tasks;
|
|
using QuizPleaseTest.Boot.Flow;
|
|
using QuizPleaseTest.Boot.UI;
|
|
using QuizPleaseTest.Common.StateMachine;
|
|
|
|
namespace QuizPleaseTest.Boot.States
|
|
{
|
|
public class MenuState : IState
|
|
{
|
|
private readonly MenuUIView _view;
|
|
private readonly IMenuRestartSignal _restartSignal;
|
|
|
|
public MenuState(MenuUIView view, IMenuRestartSignal restartSignal)
|
|
{
|
|
_view = view;
|
|
_restartSignal = restartSignal;
|
|
}
|
|
|
|
public async UniTask EnterAsync(CancellationToken ct)
|
|
{
|
|
_view.Bind(new MenuUIViewModel(_restartSignal));
|
|
_view.Initialize();
|
|
|
|
try
|
|
{
|
|
await _restartSignal.WaitAsync(ct);
|
|
}
|
|
catch (OperationCanceledException) when (ct.IsCancellationRequested)
|
|
{
|
|
_view.Release();
|
|
throw;
|
|
}
|
|
}
|
|
|
|
public UniTask ExitAsync(CancellationToken ct)
|
|
{
|
|
_view.Release();
|
|
return UniTask.CompletedTask;
|
|
}
|
|
}
|
|
}
|