【问题标题】:How to make a Windows Service listen for additional request while it is already processing the current request?如何让 Windows 服务在处理当前请求时侦听其他请求?
【发布时间】:2011-02-21 23:45:44
【问题描述】:

我需要在 Visual Studio 2003 下的 VB.net 中构建一个 Windows 服务。这个 Windows 服务应该从本地文件夹中读取平面文件(大约一百万条记录的巨大文件)并将其上传到相应的数据库表中。这应该在回滚模式(数据库事务)下完成。在将数据传输到表时,服务还应该监听其他客户端请求。因此,如果在客户端请求取消操作之间,服务应该回滚事务并向客户端提供反馈。此 Windows 服务还不断写入有关状态和错误记录的两个日志文件。 我的客户是 ASPX 页面(一个网站)。

谁能帮我解释一下如何在 Windows 服务中组织和实现此功能(同时处理和侦听其他客户端请求。例如取消请求)。

您能否建议我实现这一目标的理想方法(例如,最好将其实现为 Web 服务或 Windows 服务,或者只是一个远程对象或其他方式)。

提前感谢大家的帮助!

【问题讨论】:

    标签: asp.net vb.net windows-services oracle11g .net-remoting


    【解决方案1】:

    您可以构建您的服务以生成执行繁重工作的“工作线程”,而它只是侦听其他请求。因为未来的调用可能必须处理当前的工作人员,所以这可能比使用 IIS 将其构建为 Web 服务更好。

    我的设置方式是:服务主线程正在侦听端口或管道以进行通信。当它收到处理数据的调用时,它会产生一个工作线程,给它一些“状态令牌”(可能就像对布尔变量的引用一样简单),它将定期检查以确保它应该仍在运行.线程启动,服务返回侦听(网络类维护接收数据的缓冲区,因此只有在“超时”时调用才会失败)。

    如果服务收到中止调用,它会将令牌设置为“取消”值。工作线程将在下一次轮询时读取此值并获取消息,回滚事务并终止。

    这可以设置为让多个工作人员同时处理多个文件,属于由他们的 IP 或您来回传递的某些唯一“会话”标识符键入的调用者。

    【讨论】:

      【解决方案2】:

      你可以像FTP 那样设计你的作品。 FTP 使用两个端口,一个用于命令,另一个用于数据传输。

      您可以考虑两个类,一个用于命令解析,另一个用于数据传输,每个都位于不同的线程上。

      在线程之间使用通信通道(如特权队列)。如果您移至 .NET 4.0 和更多线程功能,例如 CancellationTokens,则可以使用 Syste.Collections.Concurrent...

      WCF 比 Web 服务更有优势,但将其与 Windows 服务进行比较需要您的项目的更多细节。一般来说WCF比windows服务更容易实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-03
        • 2014-06-04
        • 2022-07-05
        相关资源
        最近更新 更多