Добрый день! Помогите "не знающему".
Суть вопроса:
Есть база данных, и есть файл с SQL командами. при запуске приложения хотел выполнить их в фоновый поток, а на форму в ProgressBar'е выводить результат. Прочитал статью с "местную" по работе с потоками, но так и не нашел как обратиться к контролу из фоновой задачи. В потоке создаю еще одно подключение, что бы основные функции нормально работали, так как паралельные транзакции не поддерживаются (толи ограничение sql-сервака или Framework'a)
вот код который и работает 50/50, а мне нужно все 100
запуск потока
Thread t = new Thread(SQLScript);
t.Start(DM.Connection.ConnectionString);
код потока
public void SQLScript(Object ConnectionString)
{
if (System.IO.File.Exists(System.IO.Directory.GetCurrentDirectory() + @"\sql\SQLScript.sql") == true)
{
lock (this.toolStripStatusLabel2)
{
this.toolStripStatusLabel2.Text = "Переиндексация таблиц";
}
lock (this.toolStripProgressBar1)
{
this.toolStripProgressBar1.Value = 0;
}
DataModuleClass dm1 = new DataModuleClass();
dm1.Connection = new FbConnection((String)ConnectionString);
dm1.Connection.Open();
dm1.Command = new FbCommand();
dm1.Command.Connection = dm1.Connection;
List<string> reindex = new List<string>();
reindex.AddRange(System.IO.File.ReadAllLines(System.IO.Directory.GetCurrentDirectory() + @"\ReIndexDatabase.sql"));
lock (this.toolStripProgressBar1)
{
this.toolStripProgressBar1.Maximum = reindex.Count;
}
dm1.Command.Transaction = dm1.Connection.BeginTransaction();
for (int i = 0; i < reindex.Count; i++)
{
dm1.Command.CommandText = reindex[i];
dm1.Command.ExecuteNonQuery();
lock (this.toolStripProgressBar1)
{
this.toolStripProgressBar1.Value += 1;
}
}
dm1.Command.Transaction.Commit();
lock (this.toolStripStatusLabel2)
{
this.toolStripStatusLabel2.Text = "простой";
}
}
}
04.12.07 14:36: Перенесено модератором из '.NET' — AndrewVK
Можно при помощи анономных делегатов:
delegate void SetText(string Text);
// в методе SQLScript
public void SQLScript(Object ConnectionString)
{
//...
SetText setText = delegate(string Text)
{
this.toolStripStatusLabel2.Text = Text;
};
this.Invoke(setText, new object[] {"Переиндексация таблиц"});
//... и так аналогично для каждого вызова из не GUI потока (определяется InvokeRequire)
}
Здравствуйте, ZARATUSTR, Вы писали:
ZAR>Можно при помощи анономных делегатов:
ZAR>
ZAR>delegate void SetText(string Text);
ZAR>// в методе SQLScript
ZAR>public void SQLScript(Object ConnectionString)
ZAR>{
ZAR> //...
ZAR> SetText setText = delegate(string Text)
ZAR> {
ZAR> this.toolStripStatusLabel2.Text = Text;
ZAR> };
ZAR> this.Invoke(setText, new object[] {"Переиндексация таблиц"});
ZAR> //... и так аналогично для каждого вызова из не GUI потока (определяется InvokeRequire)
ZAR>}
ZAR>
Спасибо. вопрос решился))
Здравствуйте, Larsik, Вы писали:
L>Здравствуйте, ZARATUSTR, Вы писали:
ZAR>>Можно при помощи анономных делегатов:
ZAR>>
ZAR>>delegate void SetText(string Text);
ZAR>>// в методе SQLScript
ZAR>>public void SQLScript(Object ConnectionString)
ZAR>>{
ZAR>> //...
ZAR>> SetText setText = delegate(string Text)
ZAR>> {
ZAR>> this.toolStripStatusLabel2.Text = Text;
ZAR>> };
ZAR>> this.Invoke(setText, new object[] {"Переиндексация таблиц"});
ZAR>> //... и так аналогично для каждого вызова из не GUI потока (определяется InvokeRequire)
ZAR>>}
ZAR>>
L>Спасибо. вопрос решился))
ещё проще:
this.Invoke((EventHandler)delegate
{
toolStripStatusLabel2.Text = "Переиндексация таблиц...";
});