C# 如何终止(而不是取消)已调用的异步任务?

C# 如何终止(而不是取消)已调用的异步任务?,c#,async-await,kill,C#,Async Await,Kill,我正在开发一个通过串口发送和接收命令的应用程序。有时我正在与之通信的硬件没有响应,如何阻止我的应用程序等待响应?因为它不允许我重试发送和接收命令。当我第二次调用sendRecvCMDAsync()函数时,我得到一个“对端口'COM#'的访问被拒绝”异常 这是我的串口通讯代码 public async Task<List<String>> sendRecvCMDAsync(String COMPort, String FW_CMD, List<Stri

我正在开发一个通过串口发送和接收命令的应用程序。有时我正在与之通信的硬件没有响应,如何阻止我的应用程序等待响应?因为它不允许我重试发送和接收命令。当我第二次调用sendRecvCMDAsync()函数时,我得到一个“对端口'COM#'的访问被拒绝”异常

这是我的串口通讯代码

        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('\0');
                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 void btnCancelSend()
 {
    cts.Cancel();
 }

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

启动自己的
线程

自己做信息泵


当硬件出现故障时,您可以
.Abort()
执行此操作。您的场景对于async/await是不典型的。

启动自己的
线程

自己做信息泵

当硬件出现故障时,您可以
.Abort()
执行此操作。对于async/await,您的场景是不典型的。

干净地终止(如终止)操作的唯一方法是在单独的进程中运行它。最好取消

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

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

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

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



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

SerialPort没有支持取消的方法。因此,您不能通过该方法取消。您可能会调用
Close
,但请注意,基于MSDN文档,这会产生副作用。不幸的是,关闭端口会引发异常。但是我想这就完成了。SerialPort没有支持取消的方法。因此,您不能通过该方法取消。您可能会调用
Close
,但请注意,基于MSDN文档,这会产生副作用。不幸的是,关闭端口会引发异常。但我想这就完成了。有没有更好的方法与可能出现故障的硬件进行通信?我不太清楚。顺便说一句,哇,我不知道还有一个电子论坛。谢谢有没有更好的方法与可能出现故障的硬件进行通信?我对此不太清楚。顺便说一句,哇,我不知道还有一个电子论坛。谢谢嗨,取消的问题是它不会影响已经执行的代码行。例如:如果我已成功发送命令,并且正在等待接收命令,那么它将不会停止等待命令。这意味着在该操作完成之前,我无法访问该端口。@MilindaSeneviratne:如果读取操作使用了
CancellationToken
,则可以取消读取。如果你通过关闭句柄来进行“大规模取消”,那么你就可以取消读取。@斯蒂芬克利里:你可以用一个例子来详细说明一下,在任务方面,如何“关闭句柄”?@squashed.bugaboo:一个例子是,如果你使用
stream.ReadAsync
,,您可以通过调用
Stream.Dispose
来关闭底层句柄。您好,取消的问题是它不会影响已执行的代码行。例如:如果我已成功发送命令,并且正在等待接收命令,那么它将不会停止等待命令。这意味着在该操作完成之前,我无法访问该端口。@MilindaSeneviratne:如果读取操作使用了
CancellationToken
,则可以取消读取。如果你通过关闭句柄来进行“大规模取消”,那么你就可以取消读取。@斯蒂芬克利里:你可以用一个例子来详细说明一下,在任务方面,如何“关闭句柄”?@squashed.bugaboo:一个例子是,如果你使用
stream.ReadAsync
,,您可以通过调用
Stream.Dispose
关闭底层句柄。
 public void btnCancelSend()
 {
    cts.Cancel();
 }