-
Изучаю С#. Разбирался с потоками. Не понятно следующее.
1). В Delphi было TThread свойство Terminated и метод Terminate. Обычно я действовал по следующему принципу:
procedure TMyThread.Execute;
begin
while not Terminated do
begin
//Do something
end;
end;
…
//из основного потока:
mythread.Terminate;
mythread.WaitFor;
Как в C# организовать подобное? Вычитал что есть метод Abort и класс ThreadAbortException. Например:
private void MyThreadStart()
{
try
{
while (true)
{
for (int i = 0; i <= 500; i++)
{
listBox1.Items.Add(i);
}
Thread.Sleep(100);
}
}
catch (ThreadAbortException e)
{
listBox1.Items.Add("Thread Abort!" + e.ToString());
}
}
//из основного потока:
mythread.Abort();
mythread.Join();
Но дело в том,что в случае Terminated и Terminate тело моего цикла while гарантировано завершалось, а тут получается, что нет. В частности в ListBox будут блоки чисел не 1..500 а 1…Случайное число. Как же мне организовать в C# схему которая была в Delph? Наследоваться от Thread и объявлять нужное свойство а-ля Terminate? Или есть какой-то стандартный подход, о котором я не знаю?
2). Опять таки в Delphi был метод Syncronize(), а как быть в C#? Корректно ли писать listBox1.Items.Add(i) в дополнительном потоке (если речь идет только о добавлении элементов)? -
Ilya39 © (08.09.05 16:54) [1]
> Наследоваться от Thread
Оказывается TThread обявлен как sealed, от него и не унаследуешся... -
Гость12 (08.09.05 18:11) [2]Посмотри ьакую схему
ManualResetEvent allDone
в потоке
allDone.Reset();
...
allDone.WaitOne(); // тормознуть поток
В другом потоке
allDone.Set(); // продолжаем выполнять
может помогет. (Просто не совсем понял задачу) -
Гость12 (08.09.05 18:16) [3]Кстати: Если я правильно понял то можно сделать так:
Досчитал до 500 и затем
allDone.WaitOne //поток останавливается до allDone.Set()
а в другом если ненадо запускать делаешб Abort()/ -
ilya39 © (09.09.05 09:39) [4]
> Гость12 (08.09.05 18:16)
Мне не надо ждать в потоке, мне надо что-бы я его запустил и он делал неч-то непрерывно и переодически выплевывал результат в основной поток. А по команде из основного потока, "доделав" тело цикла while завершался. Но в принципе, зря я наверно дискуссию затеял. Можно обявить еще одну логическую переменную MyTerminate например и её использовать:метод ThreadStart:
while (!MyTerminate)
{
//Do some work...
} -
ilya39 © (09.09.05 09:43) [5]Просто меня смутило что разработчики C# не реализовали в классе Thread метод и свойство подобные Terminate и Terminated как в Delphi - ситуация-то стандартная....
-
ilya39 © (09.09.05 12:01) [6]Отвечаю сам себе про Syncronize():
http://www.gotdotnet.ru/DotNet/FAQ/WindowsForms/Misc/299.aspx -
2 ilya39
А чем вам не подходит :
Gets a value containing the states of the current thread.
public ThreadState ThreadState {get;}
Property Value
One of the ThreadState values indicating the state of the current thread. The initial value is Unstarted. -
ilya39 © (12.09.05 13:32) [8]
> [7] bizonwar © (12.09.05 12:35)
Вы, наверно, не совсем поняли о чем я спрашивал. Не понимаю причем здесь свойство отображающее состояние потока.... -
2 ilya39 © (12.09.05 13:32) [8]
Да, прошу прощения, не разобрался. -
Я тут попробовал, получилось вот что:
int Counter = 0;
private void DoWork()
{
for(int i = Counter; i <= 5; i++)
{
MessageBox.Show(i.ToString());
Counter = i;
Thread.Sleep(5000);
}
}
public void ThreadProcedure()
{
try
{
DoWork();
}
catch(ThreadAbortException e)
{
Thread.ResetAbort();
ThreadProcedure();
}
}