Дубликат сценария входа - PullRequest
0 голосов
/ 17 июня 2009

хорошо, поэтому я пишу класс «рабочего» входа в систему на C #, и я столкнулся с небольшим затруднением. Я думал, что моя логика за этим была безупречна! (

Но я не могу понять, почему это происходит с первого раза, а не только с дубликатами: (

namespace Lab.Core.BackgroundWorker {
    using Lab.Core;
    using Lab.Core.Net;

    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.Text;
    using System.Threading;
    using System.Windows.Forms;

    public class MultiLogon : IWorker {
        private static Hashtable LoggedOnUsers = new Hashtable();
        private Thread _worker = null;
        //private Thread m_UsersUpdate = null;

        public delegate Boolean AddUserToCollectionDelegate(String user, String computer);
        public delegate void ClearCollectionDelegate(String user);
        public delegate Boolean IsUserLoggedInDelegate(String user);

        public Boolean AddUserToCollection(String user, String computer) {
            int retVal = MultiLogon.LoggedOnUsers.Count + 1;
            if (String.IsNullOrEmpty(user) || String.IsNullOrEmpty(computer))
                return false;
            if (!MultiLogon.LoggedOnUsers.ContainsKey(user))
                MultiLogon.LoggedOnUsers.Add(user, computer);

            return (MultiLogon.LoggedOnUsers.Count == retVal);
        }

        public void ClearCollection() {
            if (MultiLogon.LoggedOnUsers.Count > 0)
                MultiLogon.LoggedOnUsers.Clear();
        }

        public Boolean IsUserLoggedIn(String user) {
            if (String.IsNullOrEmpty(user))
                return false;
            return (LoggedOnUsers.Contains(user));
        }

        #region IWorker Members

        public void Run(object obj) {
            AddUserToCollectionDelegate add = new AddUserToCollectionDelegate(AddUserToCollection);
            //ClearCollectionDelegate clear = new ClearCollectionDelegate(ClearCollection);
            //IsUserLoggedInDelegate isLogged = new IsUserLoggedInDelegate(IsUserLoggedIn);

            while (true) {
                foreach (Computer c in ComputerList.Instance)
                    if (!add.Invoke(c.UserName, c.MachineName)) {
                        // duplicate! or not? :/
                        // Credit (through adoption of code) goes to:
                        //  http://bytes.com/groups/net-c/263778-quickly-finding-duplicates-arraylist#post1059834
                        foreach (DictionaryEntry item in MultiLogon.LoggedOnUsers) {
                            MessageBox.Show((String)item.Key, (String)item.Value);
                            //NetworkMessage.Send((String)item.Value, String.Format("It is against lab policy to share your account with anyone other than yourself or use someone else's account! Logout immediately or further action will be taken. Your action has been logged."));
                            //OffenseManager.Instance.AddOffense((String)item.Key, null, String.Format("Account sharing - Computer: {0}", item.Value), false);
                        }
                    }
                Thread.Sleep(750);
            }
        }

        public void Start() {
            _worker = new Thread(new ParameterizedThreadStart(Run));
            _worker.IsBackground = true;
            _worker.Start();
        }

        public void Stop() {
            if (_worker.IsAlive)
                _worker.Abort();
        }

        #endregion
    }
}

Извинения за длинный код файла. Я не знаю точно, что наклеить, чтобы помочь вам, ребята, помогите мне. : /

Заранее спасибо! :)

1 Ответ

0 голосов
/ 17 июня 2009

Может быть условие гонки нити.
Вы пытались заблокировать коллекцию при поиске / вставке в нее?
Я не верю, что Hashtable безопасен для потоков.

Возможно, вы захотите поставить

lock(this) {
}

блокировать все вокруг доступа к хеш-таблице.

...