Проблема с потоком в C#
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Проблема с потоком в C# - 2008-06-17 14:04:55.270000
|
|
|
ZneP
Сообщений: 910
Оценки: 0
Присоединился: 2006-08-21 16:11:47
|
Всем привет Пишу программу, хочу использовать поток для заполнения DataGrid из БД. Когда стартует поток (запускаю его сразу в функции обработки события Load(), все компоненты проинициализированы) то выдается след. ошибка: Cross-thread operation not valid: Control 'data_grid' accessed from a thread other than the thread it was created on. Ругается на строчку data_grid.DataSource = ds.Tables[0]; из функции, которая обрабатывается во время работы потока. А вот и сама функция:
private void Fill_DataGrid()
{
string query = "SELECT ......";
p.ExecuteSql(query, ref ds);
if (ds != null && ds.Tables[0].Rows.Count > 0)
{
data_grid.DataSource = ds.Tables[0];
}
}
Без потока все работает нормально. ХЗ что делать.
|
|
|
RE: Проблема с потоком в C# - 2008-06-17 16:26:35.936666
|
|
|
ahap
Сообщений: 5
Оценки: 0
Присоединился: 2006-09-21 09:50:04.816666
|
Все методы и свойства, кроме Invoke(), InvokeRequired, BeginInvoke(), EndInvoke(), CreateGraphics(), контролов не потоко-безопасны, вызывать методы контрола из потока который не создан в этом потоке нужно при поможи методов Invoke, передавая им делегат и его параметры. Вот пример синхронной работы с контролом:
delegate void SetDataSourceDelegate(DataTable dataTable);
void SetDataGridSource(DataTable dataTable)
{
if (dataGrid1.InvokeRequired)
{
SetDataSourceDelegate dataSourceDelegate = new SetDataSourceDelegate(SetDataSourceCallback);
dataGrid1.Invoke(dataSourceDelegate, new Object[]{dataTable});
}
else
dataGrid1.DataSource = dataTable;
} Для асинхронного вызова необходимо исспользовать BeginInvoke(), EndInvoke()
|
|
|
|
|