Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.149.233.72] |
|
Сообщ.
#1
,
|
|
|
Есть простое консольное приложение, которое хостит wcf-сервис.
В сервисе есть список подключенных клиентов с указанием времени последней активности, этот список хочу по таймеру проверять и очищать. У сервиса есть метод получения текущих подключенных клиентов. Проблема в том, что на сервере будто существует 2 инстанса списков клиентов. В потоке таймера список меняется, но эти изменения не отражаются на списке, который возвращается через метод контракта. Часть кода: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] public class Server : IServer { private List<ConnectedClient> clients = new List<ConnectedClient>(); public void Start() { //... var thread = new Thread( (() => { while (true) { DeleteHangedClients(); Thread.Sleep(1000); } })); thread.Start(); //timer = new Timer(o => DeleteHangedClients(), null, 0, 1000); } private Timer timer; public IList<string> GetClients(string name) { return (from c in clients select c.Name).ToList(); } private void DeleteHangedClients() { var dateTimeNow = DateTime.Now; var timeOut = TimeSpan.FromSeconds(1); lock (clients) { for (var index = clients.Count - 1; index >= 0; index--) { if (dateTimeNow - clients[index].LastAccess > timeOut) { clients.RemoveAt(index); } } } } Добавлено Вопрос в том, почему так происходит, как это исправить или как правильно реализовать задуманную идею |
Сообщ.
#2
,
|
|
|
Так как метод получения списка клиентов довольно прост, могу предположить, что список, который ворзвращаетсмя по контракту не меняется так, как не меняется список clients. а вот почему он не меняется сказать по этому фрагменту кода не могу.
Добавлено И да, бывает ведь ещё кеширование всякое... |
Сообщ.
#3
,
|
|
|
1. Попробуй лочить список в методе GetClients.
2. Для контроля инстансов списков сделай его readonly. Если не поможет, то ещё и static. тогда он точно будет в одном экземпляре. |