我从下面的代码中收到此错误“由于线程退出或应用程序请求,I / O操作已中止”。
if (SkyQueue.IsRunning){
_mediatimer.Tick -= UpdateSkyEvent;
_mediatimer?.Stop();
_mediatimer?.Dispose();
SkyQueue.Stop();
SkySystem.ConnectSerial = false;}
如果我添加秒表,则不会发生错误。
if (SkyQueue.IsRunning){
_mediatimer.Tick -= UpdateSkyEvent;
_mediatimer?.Stop();
_mediatimer?.Dispose();
var sw = Stopwatch.StartNew();
while (sw.Elapsed.TotalMilliseconds < 1000)
{
}
sw.Stop();
SkyQueue.Stop();
SkySystem.ConnectSerial = false;}
SkyQueue运行一个阻塞队列,该阻塞队列运行命令到串行端口,并将结果放入ConcurrentDictionary中,UpdateSkyEvent会提取结果。在这里,我试图关闭所有设备,并断开与端口的连接。我的猜测是,当我停止SkyQueue时,UpdateSkyEvent仍在运行,因此我得到了错误。秒表似乎给了端口足够的时间来回复上一个事件并最终停止。添加秒表似乎很容易。有没有更好的方法来找出上一个事件是否真正结束?