アプリケーションの停止Endイベントの解決策

3648 ワード

プロジェクトをする時、ERPデータを同期する問題に出会って、取引先の要求は:プログラムの中で、1つの開始時間を設定して、更に1つの時間間隔を設定して、プログラムに一定の時間ごとに販売記録をエクスポートさせて、この開始時間と時間間隔は手動で設定を修正することができます.この問題は私に何日も付きまとって、やっと解決して、ドキュメントの記録を書きました.
まず、プログラムのタイミングでタスクを実行するには、ASPを使用することができる.NETのTimerタイミングですが、このタイミングは正確ではありません.それを使うと、他の問題にも遭遇します.後で言及します.2つ目の方法は、Quartzと呼ばれています.NETオープンソースプロジェクトは、タイミングジョブのスケジューリングに特化しています.
今回のプロジェクトで私が使ったのはQuartzです.NETコンポーネントは、彼がジョブをスケジュールするのに便利ですが、問題も来ました.プログラムがしばらく実行されると、自動タスクが停止していることに気づきました.ネットで資料を調べてみると、言い方が違います.   
その後、資料を調べたり、自分で実験したりして、サイトのアプリケーションが要求されていない場合、一定の時間が経つとアプリケーションが停止し、具体的には、サイトの最後のセッションが終了すると、サイトのアプリケーションが終了することを証明しました.もちろんアプリケーションがトリガーされますEndイベント.それに伴ってタイミングタスクも停止します.今の問題は、どのようにしてウェブサイトに要求がありますか?アプリケーションを使用する方法Endイベントは発生しませんか?
この問題はネット上でもいろいろな説があります.例えば、ApplicationでEndでプログラムでリクエストサイトをシミュレートし、Application_を再開スタートイベントには、プログラムコードも表示されます.http://asdfblog.com/technology/aspnet-scheduled-tasks-with-quartznet.htmlここで詳しく説明します.しかし、私はブロガーのやり方に従って、私が望んでいる機能を実現していません.しかし、IISアプリケーションプールの回収の問題を処理するために使用されています.孟子E章によると、実行するタスクをスケジューリングするために独立したスレッドを新規作成するのは、個人的に面倒だと思いますが、このような方法は採用されていません.
最後に、ASPを利用する簡単な処理方法を発見した.NETのキャッシュタイムアウト技術.以下、具体的に説明します.基本的な考え方:
アプリケーションが起動すると、Webサイトのページがプログラムでキャッシュされます.Webページをキャッシュするときに、キャッシュの有効期限と、キャッシュの有効期限が切れたときにトリガーされるコールバックイベントを設定します.キャッシュの有効期限が切れたときにトリガーされるコールバックイベントが重要です.キャッシュが期限切れになったときにプログラムで要求ウェブサイトのページをシミュレートして、再びキャッシュして、循環します...
 
コード説明:(すべてGlobal.asaxにあります)
private const string DummyPageUrl = "http:/index.aspx";  
    private const string DummyCacheItemKey = "GagaGuguGigi";  
    Quartz.IScheduler sched = SingletonScheduler.GetIntance();  
    void Application_Start(object sender, EventArgs e)  
    {        
        //      
        RegisterCacheEntry();  
    }  
      
    //         5     ,           
     private void RegisterCacheEntry()  
    {  
        if (null != HttpContext.Current.Cache[DummyCacheItemKey]) return;  
        HttpContext.Current.Cache.Add(DummyCacheItemKey, "Test", null, DateTime.MaxValue,  
            TimeSpan.FromMinutes(5), CacheItemPriority.NotRemovable,  
            new CacheItemRemovedCallback(CacheItemRemovedCallback));  
    }  
      
    //               ,          
     public void CacheItemRemovedCallback(string key, object value, CacheItemRemovedReason reason)  
    {        
        HitPage();  
    }  
      
    //           
     private void HitPage()  
    {  
        System.Net.WebClient client = new System.Net.WebClient();  
        client.DownloadData(DummyPageUrl);   
    }      
    protected void Application_BeginRequest(Object sender, EventArgs e)  
    {  
        if (HttpContext.Current.Request.Url.ToString() == DummyPageUrl)  
        {  
            RegisterCacheEntry();  
        }  
    }

これにより、ウェブサイトアプリケーションはwindowsサービスを実行するように、バックグラウンドで黙々と実行することができ、理解できませんでした.ここを参照してください.http://www.codeproject.com/KB/aspnet/ASPNETService.aspx付:Quartz.Net詳細チュートリアル参照:①公式チュートリアル:http://quartznet.sourceforge.net/tutorial/index.html; ②中国語訳:http://www.cnblogs.com/shanyou/category/102991.html
================================================================
WebFormでQuartzを使用する.Netコンポーネントは、個人テストの結果、感覚も不安定で、最終的にはWinformクライアントプログラム+Quartz.NETコンポーネントが実装され,プログラムはずっとサーバ上に置かれて走っている.
サーバー側のプログラムが停止しないようにwindowsサービスと書くと、サーバーが起動するとタスクが実行され、サーバーが停止しない限り、プログラムもずっと実行されます.
もちろん、これは独立したホストにしか適用できません.仮想空間はだめです.
添付:
1.Windowsサービスの作成方法:
http://msdn.microsoft.com/zh-cn/library/vstudio/9k985bc9.aspx
http://www.cnblogs.com/tuyile006/archive/2006/11/27/573654.html
2.windowsサービス補助クラス:http://blog.csdn.net/a497785609/article/details/9103129