2014-01-14 88 views
1

我正在用SignalR開發一些代碼。SignalR創建定時器

我想創建一個定時器,並且這個定時器很厚一個函數,而這個函數通過userName從數據庫讀取數據並獲取消息屬於調用者。

問題是如果我在每個創建的連接定時器的Hub類中創建Timer,所以這是無用的。

如果我創造這樣的

public class SignalRTime 
{ 
    private readonly Timer _timer; 
    private int _count = 0; 

    private readonly static Lazy<SignalRTime> _instance = new Lazy<SignalRTime>(() => 
     new SignalRTime(GlobalHost.ConnectionManager.GetHubContext<TimerHub>().Clients)); 

    private SignalRTime(IHubConnectionContext clients) 
    { 
     Clients = clients; 
     _timer = new Timer(UpdateTime, null, 0, 6000); 
    } 


    private void UpdateTime(object state) 
    { 
     lock(CurrentTime) 
     { 
      _count++; 
     } 
     Clients.All.broadcastTime(CurrentTime); 
    } 

    public static SignalRTime Instance 
    { 
     get 
     { 
      return _instance.Value; 
     } 
    } 

    private IHubConnectionContext Clients 
    { 
     get; 
     set; 
    } 

    public string CurrentTime 
    { 
     get 
     { 
      return _count.ToString(); 
     } 
    } 

} 

在這種情況下,計時器我無法讀取當前用戶名,因爲HttpContext.Current爲null,儘管我登錄。

我不知道我在做什麼。

感謝您的幫助

回答

0

不能完全確定你正在試圖在這一類的事,但總的來說,你應該有一個單獨的計時器類(不是集線器類),然後使用的ConnectionManager來調用集線器方法類。

+0

這個類是單獨的類,並且定時器可以正常工作,但是我無法從這個類中獲得當前用戶名。 – bluenesman

+0

所以這不是一個真正的SignalR問題。您需要了解如何在asp.net應用程序中使用會話管理和身份驗證,以及如何檢索當前用戶名。一旦你有了用戶名,你可以使用GetHubContext來訪問相關的方法。 –

+0

事實上,這是SignalR問題,因爲當我使用Lazy <> SignalR清除所有會話創建實例時,所以我無法訪問任何會話上下文。而SignalR擁有自己的會話上下文,我無法從不同的類訪問它。因此,因爲SignalR清除Web會話,我無法訪問用戶名,上面的類不起作用。我無法在Hub類中創建計時器,如果我這樣做,signalR將在每個連接上創建新計時器。 – bluenesman