#c# #user-interface #dispose #idisposable
#c# #пользовательский интерфейс #удаление #idisposable
Вопрос:
Я полный профан в удалении объектов, поэтому приношу извинения —
Итак, у меня есть класс под названием «Logger», в котором у меня есть источник данных и привязки. Я хотел, чтобы весь мой пользовательский интерфейс находился в другом проекте, поэтому, когда пользовательский интерфейс устанавливает свой источник данных в 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);
}
}
Всякий раз, когда я закрываю программу, я получаю исключение, в котором говорится, что я пытался получить доступ к элементу управления, который уже был удален — где и как я должен его удалить? Какой фактический объект вызывает ошибку?
Большое спасибо, Уильям
Ответ №1:
похоже, вы используете threads…in в этом случае в методе exit вы должны завершить работу всех потоков и дождаться их завершения перед выходом из приложения. Я предполагаю, что потоки пытаются получить доступ к удаляемым объектам.
кроме того, при работе с классами, которые реализуют 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)); });
}