Member 13801581 Ответов: 2

C# как отменить задачу, запущенную нажатием на другую кнопку?


Привет я хочу отменить текущую задачу запущенную нажатием на другую кнопку
как же так?

Что я уже пробовал:

private async void Search_Button_ClickAsync(object sender, EventArgs e)
        {
             await (Task.Run(() =>
			 //... my program
			 ));
        }

private async void CancelButton_ClickAsync(object sender, EventArgs e)
        {
// i want cancel by click this button
        }		

2 Ответов

Рейтинг:
2

RickZeeland

Вы можете сделать это с помощью CancellationTokenSource смотрите пример здесь: Параллельное Программирование: Отмена Задач | Часто Задаваемые Вопросы На C# [^]
Однако вам понадобится этот синтаксис:

Task.Factory.StartNew()


Member 13801581

К сожалению, он не ответил!

CancellationTokenSource cTokenSource = новый CancellationTokenSource();
CancellationToken cToken = новый CancellationToken();

частная асинхронного Search_Button_ClickAsync недействительным(объект отправителя, EventArgs в электронной)
{
cToken = cTokenSource.Знак;
ждите (задание.Factory.StartNew(() =>
//...
,cToken));

частная CancelButton_ClickAsync недействительным(объект отправителя, EventArgs в электронной)
{
cTokenSource.Отменить();
}

}

RickZeeland

Тогда вам, возможно, понадобится tokenSource.Знак.ThrowIfCancellationRequested() в вашей задаче, особенно если она имеет плотный цикл.

[no name]

все равно не сработало!!

CancellationTokenSource cTokenSource = новый CancellationTokenSource();
CancellationToken cToken = новый CancellationToken();

частная асинхронного Search_Button_ClickAsync недействительным(объект отправителя, EventArgs в электронной)
{
cToken = cTokenSource.Знак;
ждите (задание.Factory.StartNew(() =>
{
cTokenSource.Знак.ThrowIfCancellationRequested();
//...моя программа
}
,cToken));

частная CancelButton_ClickAsync недействительным(объект отправителя, EventArgs в электронной)
{
cTokenSource.Отменить();
}

}

Рейтинг:
18

George Swan

Вам нужно проверить свой метод, чтобы узнать, была ли запрошена отмена бронирования. Вот фрагмент из ViewModel, чтобы показать тип шаблона, который вам нужен.



 private CancellationTokenSource cts;
//called from a 'start' button click
 private async void OnStartAsync(object arg)
        {
            IsStarted = true;

            cts = new CancellationTokenSource();
            CancellationToken token = cts.Token;
            try
            {
                //this runs your asynchronous method
                //you must check periodically to see 
                //if cancellation has been requested
                await Task.Run(() =>
                {
                    while (true)
                    {
                        Thread.Sleep(100);
                        //check to see if operation is cancelled
                        //and throw exception if it is
                        token.ThrowIfCancellationRequested();
                    }
                },token);
            }
            catch (OperationCanceledException)
            {
                IsStarted = false;

            }


        }

        private bool isStarted;
        public bool IsStarted
        {
            get
            {
                return isStarted;
            }
            set
            {
                isStarted = value;
                StartCommand.RaiseCanExecuteChanged();
                CancelCommand.RaiseCanExecuteChanged();

            }
        }

         //called from a 'cancel' button
        private void OnCancel(object arg)
        {
            cts.Cancel();
          
        }