Как в C# (WPF) выполнить метод спустя некоторое время после события?

373
22 апреля 2017, 21:24

В моем проекте на WPF, есть кнопка, на LeftMouseDown срабатывает событие, в котором спустя 3 секунды пока кнопка мыши зажата, выполнится метод (отправим в базу данные) но если мы отпустим левую кнопку мыши тоесть выполнится другое событие LeftMouseUp нужно отменить выполнения этого метода. Как в коде C# сгенерировать такое поведение.

Для наглядности добавлю свой код, без этой манипуляции

<Image
                            Grid.Row="2"
                            Grid.Column="1"
                            RenderOptions.BitmapScalingMode="HighQuality">
                            <Image.Style>
                                <Style TargetType="{x:Type Image}">
                                    <Setter Property="Source" Value="/Images/Panel_3/Button_1.png" />
                                    <Style.Triggers>
                                        <DataTrigger Binding="{Binding EngineStart}" Value="True">
                                            <Setter Property="Source" Value="/Images/Panel_3/Button_1_Press.png" />
                                        </DataTrigger>
                                    </Style.Triggers>
                                </Style>
                            </Image.Style>
                            <i:Interaction.Triggers>
                                <i:EventTrigger EventName="MouseLeftButtonDown">
                                    <i:InvokeCommandAction Command="{Binding EngineStartOn}" />
                                </i:EventTrigger>
                                <i:EventTrigger EventName="PreviewMouseLeftButtonUp">
                                    <i:InvokeCommandAction Command="{Binding EngineStartDown}" />
                                </i:EventTrigger>
                            </i:Interaction.Triggers>
                        </Image>

И ViewModel

    public Command EngineStartOn
    {
        get { return new Command(() =>
        {
            //Выполнить такую манипуляцию спустя 3 секунды
                EngineStart = false;
        }); }
    }
    public Command EngineStartDown
    {
        get { return new Command(() => { //Оборвать выполнения функции если не прошло 3 секунды }); }
    }
Answer 1

Ну например так:

CancellationTokenSource cts = null;
async void ScheduleDatabaseUpdate()
{
    if (cts != null)
        throw new InvalidOperationException("Update already scheduled");
    cts = new CancellationTokenSource();
    try
    {
        await Task.Delay(TimeSpan.FromSeconds(3), cts.Token);
        await Task.Run(() => <тут запись в базу>);
    }
    catch (OperationCanceledException)
    {
    }
}
void CancelPendingUpdate()
{
    if (cts == null)
        throw new InvalidOperationException("No pending update");
    cts.Cancel();
    cts = null;
}

ScheduleDatabaseUpdate вызываете на нажатии, CancelPendingUpdate на отпускании мыши.

READ ALSO
Пример приложения WPF+MVVM+EF6

Пример приложения WPF+MVVM+EF6

ЗдравствуйтеНе могли бы вы мне показать небольшой пример кода приложения, сделанного на WPF (C#) согласно паттерну MVVM и следующим условиям:

238
Как скрыть выводимый столбец в таблице? - PHP

Как скрыть выводимый столбец в таблице? - PHP

Я подключаюсь к MySQL базе данных, получаю из нее данныеВ первом столбце (Data) таблицы Data у меня должен быть файл, в котором будет много значений

335
Как выводить разную структуру постов в одном цикле wordpress?

Как выводить разную структуру постов в одном цикле wordpress?

Добрый, подскажите как реализовать вывод постов с разными калссами и разной структурой в одном цикле, не понимаю как это сделатьНапример:

275
Почему слеш в конце адресной строки ломает сайт, построенный по принципу единой точки входа?

Почему слеш в конце адресной строки ломает сайт, построенный по принципу единой точки входа?

Реализация по принципу единой точки входа, содержимое адресной строки разбивается $routes = explode('/', $_SERVER['REQUEST_URI']) и результаты передаются в обработчики

330