Как использовать токен CancellationTokenSource - PullRequest
0 голосов
/ 17 ноября 2018

Я пытаюсь реализовать мгновенную отмену задачи в моем коде c #.Я выполняю долго выполняемый сохраненный процесс в методе, и в моей форме у меня есть кнопка, чтобы отменить задачу.

Что происходит здесь (я так думаю), как только запускается команда sql, IsCancellationRequested не являетсяпоэтому проверил задание не отменяется.

Я знаю, что могу использовать SqlCommand.Cancel, но по какой-то причине это невозможно для меня.

вот мой код, дайте мне знать, если яя что-то здесь упускаю:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }


        private CancellationTokenSource _tokenSource = null;
        private CancellationToken _token;
        private Task _executionTask = null;

        SqlConnection con = new SqlConnection("myconnectionstring");
        SqlCommand cmd;

        private void Form1_Load(object sender, EventArgs e)
        {
            _tokenSource = new CancellationTokenSource();
            _token = _tokenSource.Token;
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            pictureBox1.Visible = true; //show progress
            _executionTask = Task.Factory.StartNew(this.LongRunningTask, _token, TaskCreationOptions.LongRunning, TaskScheduler.Default);

        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            _tokenSource.Cancel(); 
            pictureBox1.Visible = false; //hide progress
        }



        private void LongRunningTask()
        {
            while (true)
            {
                try
                {
                    if (_token.IsCancellationRequested)
                    {
                        _token.ThrowIfCancellationRequested();
                    }

                    con.Open();
                    cmd = new SqlCommand("sp_SaveSendMail", con);
                    cmd.ExecuteNonQuery(); //once this line gets started, control never go up to check IsCancellationRequested
                    break;
                }
                catch (OperationCanceledException ex)
                {

                    con.Close();
                    Console.WriteLine("Operation Cancelled");
                    break;
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    break;
                }

            }
        }
    }
...