Конференция ".Net" » Потоки в C# [C#]
 
  • Ilya39 © (08.09.05 16:35) [0]
    Изучаю С#. Разбирался с потоками. Не понятно следующее.
    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
  • bizonwar © (12.09.05 12:35) [7]
    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)

    Вы, наверно, не совсем поняли о чем я спрашивал. Не понимаю причем здесь свойство отображающее состояние потока....
  • bizonwar © (12.09.05 14:20) [9]
    2 ilya39 ©   (12.09.05 13:32) [8]
    Да, прошу прощения, не разобрался.
  • bizonwar © (12.09.05 14:32) [10]
    Я тут попробовал, получилось вот что:

    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();
      }

     }

 
Конференция ".Net" » Потоки в C# [C#]
Есть новые Нет новых   [119213   +30][b:0][p:0.002]