如何检测套接字何时可以关闭?

时间:2009-11-05 11:19:49

标签: c# sockets printing

我要打印到没有标准驱动程序的热敏打印机。传统上,我们的业务流程是生成打印项目的批处理文件,并通过打开的插槽将其传送到打印机。当程序完成处理并在通过关闭套接字进行整理之前,我通过弹出一个MessageBox来阻止进程,并向用户发出警告,在打印完成之前不按OK:下一行代码然后强行关闭并清除套接字。

这是一个粘性的磁带和字符串解决方案,但它达到了目的。

我最近使用WCF Web服务和LINQ数据管理对打印过程进行了全面检查。因此,批处理文件变得不那么必要了(它们在为客户打印或重新打印的情况下仍然有用,因为批处理文件形成一种“收据”来表示物理票证存在)。但旧的“填充消息框”解决方案告诉人们何时可以安全地关闭套接字在这个新程序中看起来令人无法接受。

所以我想让它刚刚完成使用套接字,优雅退出然后弹出框说完打印。快速浏览一下这个问题的可能解决方案,我遇到过:

  • 使用单独的线程进行打印过程的想法
  • 异步套接字的想法
  • 一种名为Socket.Shutdown
  • 的方法

我真正喜欢的是对这三种方法的优缺点的概述。

我们的使用场景是我们很少需要使用“队列”,因为票证打印机不像常规办公室打印机那样在任何地方使用。在场地上打印一批客户门票或300张柜台销售门票仍然是一个事件,关于谁想要做什么和什么时候没有真正的争议。即使在我们的客户网站中,如果有足够多的人使用打印机可能会导致冲突,打印机通常会在工作时受到密切监控。

当然,这是因为从打印机出来的那一分钟它有一个货币价值。一旦打印出门票,它们就会被带走以便安全存放。

因此,请记住这个业务流程我想要一些不必担心的事情,不必担心同时发出请求。

编辑:我做了很多研究并尝试了不同的事情。在这种特殊情况下,打印套接字阻止UI线程的事实不是问题。人们不希望继续使用UI,而宝贵的票据流从打印机流出。但是在查看了ASync请求的工作方式后,考虑到打开打印选项页面打开套接字的最可能的使用场景,并在退出时将其关闭,这似乎更合乎逻辑。我做过的Async教程表明,无论如何,这几乎都是可行的。

1 个答案:

答案 0 :(得分:0)

  • 在打印过程中使用单独的线程的想法: 在这种情况下,你仍然在假设同步使用套接字。这意味着您在等待响应时仍然阻止该线程。这在单独的线程中不是问题,但在性能方面它仍然不是可行的方法。

  • 异步套接字的想法: 当您不想阻止当前线程时,是使用套接字的标准方法。这不会执行任何阻塞操作,这意味着更好的性能。缺点是可能同步代码看起来更清晰并且更容易使用。我会选择这个。

  • 一种名为Socket.Shutdown的方法:这不是解决您问题的方法。这是一种禁用套接字发送和接收的方法。最好在关闭插座之前关闭插座。 例如在C#中:

    socket.Shutdown(SocketShutdown.Both); socket.Close();

请记住,在关闭应用程序时,您应该等到所有背景线程完成后再实际让应用程序关闭。