代码之家  ›  专栏  ›  技术社区  ›  iamthemerovingian

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

  •  1
  • iamthemerovingian  · 技术社区  · 9 年前

    我正在开发一个通过串行端口发送和接收命令的应用程序。有时我正在通信的硬件没有响应,我如何阻止我的应用程序等待响应?因为它不允许我重试发送和接收命令。当我第二次调用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;
        }
    

    我已经调用了cancel,但它不起作用,因为代码已经在等待响应。

    这是我的函数调用代码

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

    这是我的取消呼叫代码。

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

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

    2 回复  |  直到 9 年前
        1
  •  4
  •   Stephen Cleary    9 年前

    唯一的方法 干净利落地 kill(如在terminate中)操作是在单独的 过程 。应优先取消。

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

    请注意,这将取消 全部的 操作;特别是,如果你同时阅读和写作, 二者都 如果关闭句柄,操作将出错。

        2
  •  1
  •   bohdan_trotsenko    9 年前

    开始你自己的生活 Thread .

    自己做信息泵送。

    你可以 .Abort() 当硬件出现故障时。您的场景对于async/await来说是不典型的。