Arthur V. Ratz
Мое решение таково:
1. The C#.NET механизм отмены задач будет работать независимо от того, является ли он асинхронным ожиданием или обычным синхронным обработчиком событий нажатия кнопки;
2. Пожалуйста, убедитесь, что вы используете CancellationTokenSource объект в C# код;
3. Пожалуйста, убедитесь, что вы проверить, если CancellationTokenSource.Значение свойства IsCancellationRequested равно "true" перед каждой фазой установки драйвера в порожденной асинхронной задаче;
4. пожалуйста, убедитесь, что вы реализовали отдельный обработчик для нажатия кнопки отмены и вызова CancellationTokenSource.Метод Cancel() ;
Вот как это делается: (например, следующий код ниже реализует систему.Окна.Сформируйте приложение на базе windows, имеющее две кнопки. Первая кнопка обычно запускает задачу добавления драйвера. В этом случае он порождает задачу, которая многократно отображает окно сообщения в эфирном цикле, имитируя работу установки драйвера. Чтобы создать задачу, все, что вам нужно, это нажать на кнопку Добавить драйвер... кнопка. Чтобы отменить так называемую "установку драйвера", вам нужно нажать кнопку отменить задачу, и окна сообщений больше не будут отображаться, указывая на то, что конкретная задача была отменена:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
static public CancellationTokenSource
tokenAddDriverSource = new CancellationTokenSource();
public Form1()
{
InitializeComponent();
}
private async void BtnAddDriver_Click(object sender, EventArgs e)
{
try {
try
{
await Task.Factory.StartNew(() =>
{
bool isCanceled = false;
while (isCanceled == false)
{
// Adding driver Phase #1
if (tokenAddDriverSource.IsCancellationRequested)
isCanceled = true;
MessageBox.Show("Fire Do Action in protect to get the driver details after adding the driver in protect");
// Adding driver Phase #2
if (tokenAddDriverSource.IsCancellationRequested)
isCanceled = true;
// ....
// Adding driver Phase #N
if (tokenAddDriverSource.IsCancellationRequested)
isCanceled = true;
}
}, tokenAddDriverSource.Token);
}
catch (Exception ex)
{
}
finally
{
}
}
catch (Exception ex)
{
}
finally
{
}
}
private void CancelTask_Click(object sender, EventArgs e)
{
tokenAddDriverSource.Cancel();
}
}}
И еще одно: чтобы правильно выполнить отмену задачи, вам лучше разделить весь процесс установки драйвера на несколько этапов и выполнить следующий код перед установкой драйвера на каждом этапе:
// ....
// Adding driver Phase #N
if (tokenAddDriverSource.IsCancellationRequested)
isCanceled = true;
Это все :)
Member 13348242
Приведенный выше код будет работать, если я нажимаю на кнопку один за другим. Но как можно прервать выполнение задачи после первого нажатия на кнопку? Как я могу остановить выполнение задачи между ними?
Arthur V. Ratz
Обычно вы можете прервать эту задачу таким же образом. Окна сообщений предназначены только для демонстрационных целей. Замените код, отображающий окна сообщений, которые я разместил, пользовательским кодом, добавляющим драйвер, и вы увидите, что он работает. :)
Arthur V. Ratz
К сожалению, автор этого вопроса не опубликовал код, который специально выполняет добавление драйвера. Вероятно, было бы больше других рекомендаций относительно отмены задания. Но в любом случае, попробуйте использовать то, что я уже посоветовал, с вашим собственным кодом и проверьте, работает ли он. С моей стороны, это точно работает хорошо.
Arthur V. Ratz
В частности, я использую цикл while для создания бесконечной задачи с всплывающими окнами сообщений, которая завершается тогда и только тогда, когда запрашивается маркер отмены задачи. Вот почему перед каждой фазой добавления драйвера я выполняю проверку, установлено ли значение свойства IsCancellationRequested в значение "true". Если нет, то задача продолжит свое выполнение, в противном случае она завершится (или просто "завершится") с определенным запросом токена.