C # Task.Kill () не доступно - PullRequest
       7

C # Task.Kill () не доступно

0 голосов
/ 14 декабря 2018

Я не знаю, как я могу убить свою задачу?

    private Task ReadSerialUART;

    public void StartSerial()
    {
        ReadSerialUART = new Task(ReadSerial);
    }

    public void StopSerial()
    {
        //?? ReadSerialUART.Kill();
    }
    public void ReadSerial()
    {            
        char Key;
        while (1 == 1)
        {
            Key = (char)this.SerialPort.ReadChar();
            if (Key != 13)
            {
                this.trans.richTextBox_message.Invoke(new Action(() => this.trans.richTextBox_message.Text += Key));
            }
        }            
    }

Я пробовал ее с помощью .Kill (), но она не доступна.Я также не могу создать глобальную переменную, потому что цикл ReadSerial () while ожидает ReadChar ().

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Если вы не хотите, чтобы ReadChar() блокировал постоянно, используйте свойство ReadTimeout.Модифицированная версия вашего кода:

 private Task ReadSerialUART;

public void StartSerial()
{
    CancellationTokenSource source = new CancellationTokenSource(); // create token source
    ReadSerialUART = new Task(() => ReadSerial(source)); //start task
    Thread.Sleep(5000) //lets wait some time before cancelling task

    source.Cancel(); // you can cancel task by calling this anytime
}

public void StopSerial()
{
    //?? ReadSerialUART.Kill();
}
public void ReadSerial(CancellationToken token)
{            
    char Key;
    SerialPort.ReadTimeout = 1000; // with this ReadChar() will throw TimeoutException after 1 sec
    while (1 == 1)
    {
        try
        {
            Key = (char)this.SerialPort.ReadChar();
        }finally
        {
            token.ThrowIfCancellationRequested(); // ternimate thread if token is canceled (source.cancel() is called)
        }

        if (Key != 13)
        {
            this.trans.richTextBox_message.Invoke(new Action(() => 
            this.trans.richTextBox_message.Text += Key));
        }
    }            
}
0 голосов
/ 14 декабря 2018
    // Start notepad.
    Process process = Process.Start("notepad.exe");
    // Wait one second.
    Thread.Sleep(1000);
    // End notepad.
    process.Kill();

Добавьте эту строку в список использования:

using System.Diagnostics;

Получите список процессов с методом Process.GetProcesses (), как показано ниже

Process[] processlist = Process.GetProcesses();

 foreach (Process theprocess in processlist)
 {
     Console.WriteLine("Process: {0} ID: {1}", theprocess.ProcessName, 
           theprocess.Id);
 }

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

...