如何杀死(不取消)已被调用的异步任务?

时间:2016-02-05 03:59:41

标签: c# async-await kill

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

这是我的SerialPort通信代码,

        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 async void startSending()
 {
   cts = new CancellationTokenSource();
   ReturnParams = await sendRecvCMDAsync(xport, commandSend, paramsList, cts.Token)
 }

这是我的取消通话代码。

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

那我怎么解决这个问题呢?取消并没有帮助。

2 个答案:

答案 0 :(得分:4)

干净地杀死(如终止)操作的唯一方法是在单独的进程中运行它。取消应该是首选。

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

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

答案 1 :(得分:0)

开始自己的Thread

自己做消息。

当硬件出现故障时,您可以.Abort()。您的方案对于异步/等待是不典型的。

相关问题