Удаление объектов в пользовательском интерфейсе - PullRequest
0 голосов
/ 12 ноября 2011

Я всего лишь n00b при утилизации предметов, поэтому я прошу прощения -

Итак, у меня есть класс «Logger», в котором у меня есть источник данных и привязка. Я хотел, чтобы весь мой пользовательский интерфейс был в другом проекте, поэтому, когда пользовательский интерфейс устанавливает свой DataSource для GridControl, он использует следующий метод -

public SystemEventLog()
{
    InitializeComponent();
    ConnectionLogGrid.DataSource    = Logger.ConnectionLog.GetBindingSource(this);
    ExceptionLogGrid.DataSource     = Logger.ExceptionLog.GetBindingSource(this);
    SystemLogGrid.DataSource        = Logger.SystemLog.GetBindingSource(this);
}

Соответствующий метод в классе Logger выглядит так -

private static Control LogControl;
public static BindingSource GetBindingSource(Control LogControl)
{
    if (Logger.ConnectionLog.LogControl == null)
    {
        Logger.ConnectionLog.LogControl = LogControl;

        if (Source == null)
        {
            Source = new BindingSource()
            {
                DataSource = GetTable()
            };
        }
        return Source;
    }
    else
    {
        Logger.SystemLog.AddEntry("Logging", "A second binding source has attempted to bind to the Connection Log.", "Logger.ConnectionLog.GetDataSource");
        return null;
    }
}

И вот как вещи в других местах программы добавляют запись в журнал ...

public static void AddEntry(string Message, Log.ConnectionCategory ConnectionCategory)
{
    if (Logger.ConnectionLog.LogControl != null)
    {
        if (Logger.ConnectionLog.LogControl.InvokeRequired)
        {
            Logger.ConnectionLog.LogControl.Invoke((MethodInvoker)delegate
            {
                ThreadWrapper(Message, ConnectionCategory);
            });
        }
        else
        {
            ThreadWrapper(Message, ConnectionCategory);
        }
    }
    else
    {
        ThreadWrapper(Message, ConnectionCategory);
    }
}

Всякий раз, когда я закрываю программу, я получаю Исключение, в котором говорится, что я пытался получить доступ к элементу управления, который уже был удален - где и как я должен им распоряжаться? Каков фактический объект, который вызывает ошибку?

Спасибо заранее, William

1 Ответ

0 голосов
/ 12 ноября 2011

похоже, что вы используете потоки ... в этом случае в методе выхода вы должны закрыть все потоки и дождаться их завершения перед выходом из приложения.Я предполагаю, что потоки пытаются получить доступ к удаленным объектам.

также, когда вы имеете дело с классами, которые реализуют IDisposable, вы должны иметь код, подобный ...

, используя (var sc = new SqlConnection ()) {... // использовать его}

вот пример из приложения, которое я написал:

    private static List<Thread> threads = new List<Thread>();

    public static void Start ( )
    {
        for (int i = 0; i < Environment.ProcessorCount * 2; i++)
        {
            var t = new Thread(new ThreadStart(QueueReader));

            threads.Add(t);

            t.Start();
        }
    }

    public static void Stop ( )
    {
        threads.ForEach(t => { t.Abort(); t.Join(TimeSpan.FromSeconds(15)); });
    }
...