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