如何杀死(而不是取消)一个已经被调用的异步任务?
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 异步操作。这将导致所有现有操作完成(出现错误)。
请注意,这会取消 所有 操作;特别是,如果您同时读取和写入,如果您关闭句柄,两个操作都会出错。
我正在开发一个通过串行端口发送和接收命令的应用程序。有时与我通信的硬件没有响应,如何阻止我的应用程序等待响应?因为它不允许我重试发送和接收命令。第二次调用 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 异步操作。这将导致所有现有操作完成(出现错误)。
请注意,这会取消 所有 操作;特别是,如果您同时读取和写入,如果您关闭句柄,两个操作都会出错。