На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Многопоточный wcf-сервер , InstanceContextMode = InstanceContextMode.Single
    Есть простое консольное приложение, которое хостит wcf-сервис.
    В сервисе есть список подключенных клиентов с указанием времени последней активности, этот список хочу по таймеру проверять и очищать.
    У сервиса есть метод получения текущих подключенных клиентов. Проблема в том, что на сервере будто существует 2 инстанса списков клиентов. В потоке таймера список меняется, но эти изменения не отражаются на списке, который возвращается через метод контракта.

    Часть кода:
    ExpandedWrap disabled
          [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);
                          }
                      }
                  }
              }


    Добавлено
    Вопрос в том, почему так происходит, как это исправить или как правильно реализовать задуманную идею :)
      Так как метод получения списка клиентов довольно прост, могу предположить, что список, который ворзвращаетсмя по контракту не меняется так, как не меняется список clients. а вот почему он не меняется сказать по этому фрагменту кода не могу.

      Добавлено
      И да, бывает ведь ещё кеширование всякое...
        1. Попробуй лочить список в методе GetClients.
        2. Для контроля инстансов списков сделай его readonly. Если не поможет, то ещё и static. тогда он точно будет в одном экземпляре.
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0600 ]   [ 16 queries used ]   [ Generated: 18.04.24, 01:35 GMT ]