代码之家  ›  专栏  ›  技术社区  ›  Raj

如果没有活动线程,或者如果有活动线程,则关闭,然后等待它完成并关闭

  •  1
  • Raj  · 技术社区  · 14 年前

    alt text http://img823.imageshack.us/img823/8975/modelq.jpg

    1. 客户机发出了等待的新请求

    2. webservice和智能卡之间的当前工作应该已经完成

    3. 如果之前有任何未完成的请求,则应该完成这些请求。

    int vWorkerThreads,vWorkerThreadsMax;
    int vPortThreads,vPortThreadsMax;
    System::Threading::ThreadPool ^ vThreadPool;
    vThreadPool->GetAvailableThreads(vWorkerThreads, vPortThreads);
    vThreadPool->GetMaxThreads(vWorkerThreadsMax, vPortThreadsMax);
    ActiveThreadCount = vWorkerThreadsMax - vWorkerThreads;
    

    这意味着,我还需要让客户端请求等待?

    清理机制:使用 C_CloseAllSessions C_Finalize 调用将释放库以便它清除所有会话对象。这应该每天做一次。

    更新:

    我本可以更清楚地提出我的问题。我想说清楚,我的目标不是关闭ASP.NET Web服务。 我的目的是重置智能卡 . 当我通过ASP.NET Web服务访问智能卡时,我需要一种机制来执行重置智能卡的任务。

    我将在下面给出当前流程

    1. 客户端在午夜检测到日期更改
    2. 客户端调用函数 WebService_Close_SmartCard
    3. Web服务接收请求 Web服务\关闭\智能卡 PKCS11_Close_SmartCard . 这个 电话将通过 线程中的可用线程 游泳池。 PKCS11_Close_SmartCard will 使用智能卡的会话。
    4. 函数调用,例如 PKCS11_DigitalSign_SmartCard / PKCS11_DigitalVerify_SmartCard 到智能卡,如 PKCS11\关闭\智能卡 结束其他正在进行的会话。

    注:我是新的ASP.NET和多线程。

    1 回复  |  直到 14 年前
        1
  •  4
  •   Community LiorH    4 年前

    这个问题有了很大的更新,所以请容忍我。。。

    假设您的web方法代码没有直接\间接创建线程:

    问题 因此,您没有显式地创建任何新线程或直接/间接地使用线程池线程,您只是接收对web方法的调用并同步执行代码?

    回答

    按照“请求”而不是线程来重新表述原始问题更有帮助。

    当系统日期更改时,我想重新启动我的ASP.NET应用程序并确保 请求 当前正在执行的已完成,并且任何未完成的\已排队 请求 也完成了。

    这是自动处理的,因为存在请求队列和活动请求的概念。当ASP.NET应用程序重新启动时,所有当前和排队的请求都将完成(除非它们没有及时完成),新请求将排队,然后在新的工作进程恢复时提供服务。回收ASP.NET应用程序所属的应用程序池时,将遵循此过程。

    更新

    我想我可以从你的评论中得知,当所有请求都得到服务,然后应用程序即将关闭时,你需要运行一些清理代码。您应该将此代码放在“全局” Application_End “事件处理程序。

    更新2

    回答你最新的问题。您的要求是:

    重新启动应用程序时:

    1. 客户机发出了等待的新请求
    2. webservice和智能卡之间的当前工作应该已经完成
    3. 如果之前有任何未完成的请求,则应该完成这些请求。

    我所描述的标准回收模式支持这一点。您不需要自己处理请求线程—这是ASP.NET框架的支柱之一,它会为您处理这些问题。它是面向请求的,抽象了如何处理请求,即在多个线程上提供服务。它管理将请求放入线程,并在应用程序被回收时管理这些请求的生命周期。

    更新3

    好吧,我想我们有最后一个场景了。您正试图通过发出“关闭的”web服务调用从客户端关闭ASP.NET。基本上

    你想重新发明轮子。

    ASP.NET已具有此行为,并且受以下各项支持:

    答。 应用程序回收

    b。 应用程序结束 一个全局应用程序事件处理程序,您可以在其中放置清理代码。它会执行的 回收处理干净你的未完成的要求。

    你不需要你的“关闭”命令。

    您应该考虑让IIS回收您的应用程序,因为它支持在指定的每日时间进行回收。如果由于部署原因而无法配置IIS,则可以使用web.config“touching”强制回收IIS:

    答。在服务器上运行一个计时器,可以检查日期变化情况,然后触摸web.config文件。

    b。仍然让客户端调用“CLOSED”web方法,但是让“CLOSED”方法只接触web.config文件。

    IIS,那么“a”是最理想的。

    老实说,微软已经考虑过了

    更新4

    @拉吉,好吧,让我再重复一遍。

    您的条件是:

    1. 您需要每天重置一次智能卡。
    2. 完成未完成的请求后,您将重置智能卡。
    3. 在此过程中传入的任何新请求都应排队,然后在智能卡重置后进行服务。

    我的建议是:

    1. 将智能卡重置代码置于“应用程序\结束”中。
    2. 将IIS配置为在“00:00”时回收应用程序。确保在关联应用程序池的高级设置中配置“Disable Overlapped Recycle=True”。
    3. 在“00:00”应用程序回收确保所有当前和排队的请求都将完成。
    4. “00:00”之后,应用程序回收确保所有新请求都将排队,同时“3”中的请求完成,应用程序执行关闭步骤。
    5. 应用程序回收可确保在新进程中重新启动应用程序,并确保在步骤“4”中排队的新请求开始被处理。这里最重要的一点是,您的重置代码已在“5”中调用。

    除非你的问题中缺少一些细节,否则上述内容似乎符合你的条件。您希望执行“x,y,z”,而ASP.NET具有内置的支持,可用于实现“x,y,z”,并为您提供成熟、有保证和文档化的实现。

    我还在努力理解你为什么要谈论线程。我做多线程开发,但是在考虑ASP.NET时,谈论线程而不是请求会给讨论增加不必要的复杂性。除非你的问题还不清楚。

    我在这里试图帮助你们,因为试图自己实现这种行为是不必要的,也不是小事。