Как прервать асинхронный / ожидающий вне его метод - PullRequest
0 голосов
/ 07 мая 2018

У меня есть 1 метод и 1 событие

private void Grid_MouseWheel(object sender, MouseWheelEventArgs e)
    {
        if (currentSection == OsuSection.PreLoad)
            return;
        if(VolumeMixer.Visibility == Visibility.Collapsed)
        {
            isAwaitVolumeGaugeRunning = true;
            VolumeMixer.Visibility = Visibility.Visible;
            DoubleAnimation fadeIn = new DoubleAnimation(0, 1, TimeSpan.FromSeconds(0.1), FillBehavior.Stop);
            fadeIn.Completed += (object senderr, EventArgs ee) => { VolumeMixer.Opacity = 1; };
            VolumeMixer.BeginAnimation(OpacityProperty, fadeIn);
            Fadeout();
            return;
        }
        if (e.Delta > 0)            
            workingResources.MasterVolumeValue += 5;
        else
            workingResources.MasterVolumeValue -= 5;
    }

    private async Task Fadeout()
    {
        await Task.Delay(1500);
        if (!isAwaitVolumeGaugeRunning)
            return;
        DoubleAnimation fadeOut = new DoubleAnimation(1, 0, TimeSpan.FromSeconds(0.1), FillBehavior.Stop);
        fadeOut.Completed += (object sender, EventArgs e) => 
        {
            VolumeMixer.Opacity = 0;
            VolumeMixer.Visibility = Visibility.Collapsed;
        };
        VolumeMixer.BeginAnimation(OpacityProperty, fadeOut);
        isAwaitVolumeGaugeRunning = false;
    }

Когда пользователь прокручивает, Canvas VolumeMixer FadeIn и MasterVolueValue связываются с TextBlock и медиаэлементом. Но если в то время как пользователь непрерывно прокручивает через 1,5 сек, Canvas FadeOut и FadeIn (заняло 0,2 сек). Поэтому я хочу, чтобы холст скрывался после полной прокрутки пользователем 1,5 секунды

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Создайте CancellationTokenSource и передайте значение его свойства Token методу, который вы хотите отменить. Чтобы прервать вызов метода Cancel() вашего объекта CancellationTokenSource.

private static CancellationTokenSource _cancellationTokenSource;

private void Btn_Click(object sender, EventArgs e)
{
    if(previousPress)
    {
        _cancellationTokenSource.Cancel();
    }
    _cancellationTokenSource = new CancellationTokenSource();
    TaskMethodAsync(_cancellationTokenSource.Token);
}
private async Task TaskMethodAsync(CancellationToken cancellationToken)
{
    await Task.Delay(1000, cancellationToken);
    MessageBox.Show("Hello World!");
}
0 голосов
/ 07 мая 2018

Как упоминалось в FCin, вы можете использовать CancellationToken. Тем не менее, в этом случае мне интересно, будет ли лучше выделять серым цветом окно сообщения при нажатии кнопки? Затем снова включите кнопку после завершения асинхронной операции. Мне это кажется более чистым, чем работа с CancellationTokens и повторный запуск асинхронного процесса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...