2017-12-06 3 views
0

私のASP.NET MVCアプリケーションでこのコードを使用して、アプリケーション全体で価値を共有しています。私が何をしたいかASP.NET MVCでフォアグラウンドのスケジュールされたタスクを実行するには?

public static class Global 
{ 
    public static string Token { get; private set; }; 

    public static void LoadFromFile() 
    { 
     // loads Token value from a settings file 
    } 
} 

Token値を更新するために、一日一回LoadFromFile方法を実行することです。

現在実行中のアプリケーションの値を更新したいので、HangFireのような別のバックグラウンドタスクを使用することはできません。

どうすればいいですか?ありがとう。

更新: これは重複していると思われるメイト、質問をお読みください。現在実行中のアプリケーションの共有値を更新したい。それを別のバックグラウンドタスクで変更しても、現在のアプリケーションでは変更されません。

+2

[ASP.NET MVC Webサイトで定期的な作業を実行する方法](https://stackoverflow.com/questions/15859057/how -to-perform-periodic-work-on-an-asp-net-mvc-website) –

+0

@santoshsinghそうではない – Blendester

+0

https://www.quartz-scheduler.net/このリンクをチェックすると、 – Saineshwar

答えて

0

私は放浪しているポリシーをしばらく残すのを助けるために、答えを得ました。

私はスケジュールされたバックグラウンドタスクを実行して自分のサイトのエンドポイントにアクセスでき、そこからスタティックTokenの値を更新できます。私はかつて同様の要件に直面していた

0

、ここで私は、正確なコーディングを思い出すことはできませんが、アイデアはその日の最初の要求時にトークンを更新することでした

private static DateTime lastRunAt; 
    private static object loadingTokenLock = new object(); 

    private static bool TokenUpdateNeeded 
    { 
     get 
     { 
      return DateTime.UtcNow.DayOfYear != lastRunAt.DayOfYear; 
     } 
    } 

    public static void TryLoadToken() 
    { 
     if (TokenUpdateNeeded) 
      lock (loadingTokenLock) 
       if (TokenUpdateNeeded) 
        LoadFromFile(); 
    } 

    public static void LoadFromFile() 
    { 
     // loads Token value from a settings file 
     lastRunAt = DateTime.UtcNow; 
    } 

    void Session_Start(object sender, EventArgs e) 
    { 
     TryLoadToken(); 
    } 

を使用トリックがあります。

問題は、アプリケーションが1日以上訪問されていない場合、トークンが更新されないことです。そこで、Windowsタスクスケジューラで毎日1回サイトを訪問するようにタスクを定義しました。

+0

ありがとうエヴァン。複数のユーザーが同時にアクセスすると、問題が発生します。 – Blendester

+0

@Blendesterコメントをいただき、ありがとうございます。コードを更新して同時性を処理しました。私は別のアプローチを使用していた。定期的にサイトを要求するスケジュールされたタスクでは、BeginRequestで要求が通常の要求と区別できるように、要求クエリ文字列にキーを追加しました –

関連する問題