Задача все еще выполняется, когда уже выполнить задачу - PullRequest
1 голос
/ 04 апреля 2020

Это код задачи

public async Task Demo(int row_index, CancellationToken token)
        {
            Task t1 =  Task.Run(() =>
            {
            ChromeOptions chromeOptions = new ChromeOptions();
            ChromeDriverService chromeDriverService = ChromeDriverService.CreateDefaultService();
            chromeDriverService.SuppressInitialDiagnosticInformation = true;
            chromeDriverService.HideCommandPromptWindow = true;
            this.chrome[row_index] = new ChromeDriver(chromeDriverService, chromeOptions);
            this.chrome[row_index].Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(59.0);
            Dologin(row_index);
            //Lay Ten Fb
            chrome[row_index].Url = "https://facebook.com/profile";
            var conchim = chrome[row_index].FindElementByCssSelector("#fb-timeline-cover-name > a");
            this.dataGridView1.Rows[row_index].Cells["trangthai"].Value = "Tiến Hành Lấy Tên Facebook";
            foreach (DataGridViewRow r in dataGridView1.Rows)
            {
                string value1 = r.Cells[0].Value.ToString() ?? string.Empty;
                if (value1 == tkfacebook)
                {
                    r.Cells[4].Value = conchim.Text;
                    break;
                }
            }
            },token);
        }

Это код запуска задачи и отмены задачи.

CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token;
public async void HandleValue(DataGridViewCell cell, int row_index)
{
    switch (cell.Value.ToString())
    {
        case "Bắt đầu":
            bool flag7 = Convert.ToInt32(this.txtClickStart.Value) > Convert.ToInt32(this.txtClickEnd.Value);
            if (radioButton1.Checked && !flag7)
            {
                cell.Value = "Kết Thúc";
                token = source.Token;
                await Demo(row_index,token);
            }
            if (flag7)
            {
                this.dataGridView1.Rows[row_index].Cells["trangthai"].Value = "Cài đặt thời gian  không đúng";
                MessageBox.Show(new Form
                {
                    TopMost = true
                }, "Cài đặt thời gian  không đúng, hãy cài đặt lại!", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Hand);
                return;
            }
            bool flag3 = !radioButton1.Checked || !radioButton1.Checked && !radioButton2.Checked;
            if (flag3)
            {
                MessageBox.Show("Vui Lòng Chọn Trình Duyệt Để Bắt Đầu Chạy");
            }
            break;
        case "Kết Thúc":
            source.Cancel();
             chrome[row_index].Quit();
            cell.Value = "Bắt đầu";
            this.dataGridView1.Rows[row_index].Cells["trangthai"].Value = "Bạn đã chọn kết thúc làm việc";
            break;
    }
}

Поток не работает, поэтому я выполняю задачу. Но он все еще работает, когда я уже делаю задачу отменить. ...............

source.Cancel();

Сделать сообщение длиннее для Avabl ie Для публикации. Не волнуйтесь, эти строки ..dfsdfsdfsddfsddsadasdsadasdsadasdasdassdasdasdasdasdasdasdasdasdasdadda

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Если вы хотите отменить выполнение logi c, вам необходимо проверить флаг IsCancellationRequested.

while(!token.IsCancellationRequested)
{
 //whatever logic you want run should be placed here. This logic won't be
 //executed after you call Cancel()
}

Над logi c будет продолжать выполнять ваши logi c до тех пор, пока вы не вызовете Cancel() в источнике токена. Вы можете найти некоторые примеры 1 и 2 .

0 голосов
/ 04 апреля 2020

Ваш код для демонстрации должен включать проверку токена отмены. Попробуйте что-то вроде этого:

Task t1 =  Task.Run(() =>
        {
            ChromeOptions chromeOptions = new ChromeOptions();
            ChromeDriverService chromeDriverService = ChromeDriverService.CreateDefaultService();
            chromeDriverService.SuppressInitialDiagnosticInformation = true;
            chromeDriverService.HideCommandPromptWindow = true;
            this.chrome[row_index] = new ChromeDriver(chromeDriverService, chromeOptions);
            this.chrome[row_index].Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(59.0);
            Dologin(row_index);
            //Lay Ten Fb
            chrome[row_index].Url = "https://facebook.com/profile";
            var conchim = chrome[row_index].FindElementByCssSelector("#fb-timeline-cover-name > a");
            this.dataGridView1.Rows[row_index].Cells["trangthai"].Value = "Tiến Hành Lấy Tên Facebook";
            foreach (DataGridViewRow r in dataGridView1.Rows)
            {
                if (token.IsCancellationRequested)
                {
                    Console.WriteLine("Task was cancelled by user.");
                    token.ThrowIfCancellationRequested();
                }

                string value1 = r.Cells[0].Value.ToString() ?? string.Empty;
                if (value1 == tkfacebook)
                {
                    r.Cells[4].Value = conchim.Text;
                    break;
                }
            }
        },token);

Пожалуйста, также см. Пример здесь: https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken.iscancellationrequested?view=netframework-4.8

...