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,儘管我登錄。
我不知道我在做什麼。
感謝您的幫助
這個類是單獨的類,並且定時器可以正常工作,但是我無法從這個類中獲得當前用戶名。 – bluenesman
所以這不是一個真正的SignalR問題。您需要了解如何在asp.net應用程序中使用會話管理和身份驗證,以及如何檢索當前用戶名。一旦你有了用戶名,你可以使用GetHubContext來訪問相關的方法。 –
事實上,這是SignalR問題,因爲當我使用Lazy <> SignalR清除所有會話創建實例時,所以我無法訪問任何會話上下文。而SignalR擁有自己的會話上下文,我無法從不同的類訪問它。因此,因爲SignalR清除Web會話,我無法訪問用戶名,上面的類不起作用。我無法在Hub類中創建計時器,如果我這樣做,signalR將在每個連接上創建新計時器。 – bluenesman