如何杀死(而不是取消)一个已经被调用的异步任务?

How to kill (not cancel) a Asynchronous Task which has already been called?

我正在开发一个通过串行端口发送和接收命令的应用程序。有时与我通信的硬件没有响应,如何阻止我的应用程序等待响应?因为它不允许我重试发送和接收命令。第二次调用 sendRecvCMDAsync() 函数时出现 "Access to the port 'COM#' is denied." 异常。

这是我的串口通信代码,

        public async Task<List<String>> sendRecvCMDAsync(String COMPort, String FW_CMD, List<String> SendParamList, CancellationToken ct)
    {
        SL_Port = new SerialPort();
        try
        {
            if (COMPort != "")
            {
                SL_Port.PortName = COMPort;
            }
            else
            {
                //show a message box;
            }

            if (SL_Port.IsOpen)
            {
                SL_Port.Dispose();
                SL_Port.Close();
            }
            SL_Port.Close();
            SL_Port.Open();
            SL_Port.WriteLine(FW_CMD);
            _continue = true;
            Array.Clear(buffer, 0, buffer.Length);
            int count = 0;
            while (_continue)
            {
                mess = "";
                Task<int> bytes = SL_Port.BaseStream.ReadAsync(buffer, count, buffer.Length - count, ct);
                int bytesCount = await bytes;//I need to kill this after its started, because it is not alowing me to access the COM port unless it completes.
                count = bytesCount + count;
                mess = Encoding.ASCII.GetString(buffer).TrimEnd('[=10=]');
                if (mess.Contains(""))
                {
                    break;
                }
                else
                {
                }
            }
        }
        catch (OperationCanceledException)
        {
            MessageBox.Show("You have Successfuly Cancelled the event");
        }
        catch (Exception e)
        {

        }

        SL_Port.Dispose();
        SL_Port.Close();
        return listForFW;
    }

我调用了取消,但它不起作用,因为代码已经执行等待响应。

这是我的函数调用代码

 public async void startSending()
 {
   cts = new CancellationTokenSource();
   ReturnParams = await sendRecvCMDAsync(xport, commandSend, paramsList, cts.Token)
 }

这是我的取消呼叫代码。

 public void btnCancelSend()
 {
    cts.Cancel();
 }

那么我该如何解决这个问题呢?取消没有帮助。

开始你自己的 Thread.

自己进行消息推送。

当硬件出现故障时,您可以.Abort()它。 async/await.

你的情况不典型

彻底终止(如终止)一个操作的唯一方法是运行它在一个单独的进程中.最好取消。

对于您的情况,有另一种取消方法(更容易):传统上,可以通过关闭正在操作的句柄来取消 Win32 异步操作。这将导致所有现有操作完成(出现错误)。

请注意,这会取消 所有 操作;特别是,如果您同时读取和写入,如果您关闭句柄,两个操作都会出错。