2012-11-08 23 views
1

我正在使用C#5.0,VS 2012,MVC4。我有一個場景,在執行員工信息搜索時需要緩存員工數據和查詢緩存。如何訪問最初加載頁面時啓動的線程,稍後在c#mvc中調用ajax方法?

我並不是最初顯示所有員工,而是想發起一個線程來緩存所有員工。因此,在指數法顯示視圖時,我這樣做

 //Starting a thread to load the cache if its null 
     if (HttpRuntime.Cache["AllEmployees"] == null) 
     { 
      thCacheAllEmployees = new Thread(new ThreadStart(CacheAllEmployees)); 
      thCacheAllEmployees.Name = "CacheAllEmployees"; 
      thCacheAllEmployees.Start(); 
     } 

CacheAllEmployees是一個單獨的方法將在緩存查詢LDAP和存儲所有員工。 LDAP查詢需要大約15秒的時間。但在視圖加載並且緩存尚未加載後的前15秒內,當用戶開始在搜索框中輸入內容時,我正在調用GetFilteredEmployees操作方法的ajax方法。我想訪問先前啓動的線程,檢查它是否存在,然後等待該線程完成,以便我不需要再次執行新的LDAP查詢。

 if (thCacheAllEmployees.IsAlive) 
     { 
      thCacheAllEmployees.Join(); 

      if (HttpRuntime.Cache["AllEmployees"] != null) 
       return (List<CMSUser>)HttpRuntime.Cache["AllEmployees"]; 
     } 

但問題是,當它的Ajax調用看起來這將是一個新的主線程和不知道thCacheAllEmployees。所以thCacheAllEmployees將是空對象。所以我需要從當前應用程序中的所有活動線程中獲取此線程的實例。

當視圖首次加載到會話變量中時,我可以存儲thCacheAllEmployees的線程ID,但是如何在進行ajax方法調用時從線程池訪問該線程?

有沒有更好的方法來做到這一點?請給我們建議。

回答

0

當你認爲線程認爲行動不是數據。當你想要存儲數據時,你不會把這些數據放到一個線程中,而是將它放到內存中,然後這個內存可以通過一個或多個線程訪問,具體取決於範圍。

有很多方法可以存儲該數據。我不確定要緩存的數據對於不同的用戶會話是獨一無二的,還是隻需要一個全局緩存。任何你想從任何地方訪問你可以放入一個靜態變量的東西。您只需確保使用鎖定,以便多個線程不會嘗試同時訪問那些不安全的數據。


型號

public static class MyCache 
{ 
    private static object LockToken = new object(); 
    private static List<CMSUser> _Users { get; set; } 

    static MyCache() 
    { 
     _Users = GetUsers(); 
    } 

    public static List<CMSUser> Users 
    { 
      lock (LockToken) 
      { 
       return _Users; 
      } 
    } 
} 

控制器

public class UsersController : ApiController 
{ 
    public List<CMSUser> Get() 
    { 
     return MyCache.Users; 
    } 
} 

查看

$.ajax({ 
    url: '/api/users', 
    dataType: 'json', 
    success: function(users) { 
     // do something with users here 
    } 
}); 
+0

我怎樣才能使AJAX方法調用(主線程)等待thCacheAllEmployees線程完成,然後查詢從填寫緩存?是的,它是一個全局緩存。 – Krish

+0

我在第一次加載頁面時啓動一個線程。然後當進行ajax調用時,我需要檢查緩存是否被填充,否則我需要等待該線程完成。我怎樣才能做到這一點 ? – Krish

+0

感謝烏拉圭回合時間,並幫助:) – Krish

0

爲什麼要等待第一次調用來緩存數據?您可以在應用程序啓動過程中將其添加到Global.asax中的Application_Start函數中。

這意味着當您的應用程序啓動時,您將有15秒的開銷,但在此之後,您很有可能會去。

如果你也想在這裏使用線程,你可以把它的id放在一個靜態變量中,並用它來檢查列表是否已經加載。

+0

我不能在啓動應用程序的時候開銷。 – Krish

+0

感謝烏拉圭回合時間,並幫助:) – Krish

相關問題