Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Thread и передача параметров


Автор: AntonSaburov 18.3.2003, 23:07
Данная заметка не претендует на истину в последней инстанции - если кто-то нашел иное решение проблемы, милости прошу свои комментарии.

Итак, как только я стал разбираться с тредами мне само собой захотелось передать параметры в функцию, которая в этом треде исполняется. Увидев стандартное использование тредов, я не нашел возможности передать параметры и полез в MSDN (а куда же еще). И что я там вижу

Код

using System;
using System.Threading;

public class SimpleThread{

  public delegate void Start (object o);

  private class Args{
     public object o;
     public Start s;
     public void work(){
     s(o);
  }
  }

  public static Thread CreateThread (Start s, Object arg){

     Args a = new Args();
     a.o = arg;
     a.s = s;
     Thread t = new Thread (new ThreadStart (a.work));
     return t;
  }
}

class Worker{
  public static void WorkerMethod(object o){
     Console.WriteLine ("WorkerMethod: " + o);
  }
}

public class Work{
  public static void Main(){
     Thread t = SimpleThread.CreateThread (new SimpleThread.Start(Worker.WorkerMethod), 51);
     t.Start ();
     t.Join (Timeout.Infinite);
  }
}


Может я и стал с годами тупее, но сразу осознать, что и как происходит, к своему сожалению, я не смог.
После того, как я все-таки разобрался, я стал укладывать все в понятное русло для того, чтобы использовать технику передачи параметров в дальнейшем. И тут я понял еще более неприятное - я не могу это делать просто и понятно для себя.

После некоторых раздумий и проб я пошел по пути, который напоминает работу с тредами в JAVA - наследование класса Thread. Но т.к. наследовать в NET от Thread нельзя пришлось писать класс-обертку, после которой я все-таки смог увидеть, как мне быстро делать треды и использовать параметры.

Идея очень простая и иллюстрируется кодом:

Код

using System;
using System.Threading;

public class MyThread
{
   private Thread intThread;
   public int param1;
   public int param2;

   public MyThread(int new_param1, int new_param2)
   {
       param1 = new_param1;
       param2 = new_param2;
       intThread = new Thread(new ThreadStart(MyHandle));
   }

   public void Start()
   {
       intThread.Start();
   }

   private void MyHandle()
   {
       // Код процедуры, которая может использовать param1 и param2
       Console.WriteLine("Param1={0} Param2={1}", param1, param2);
   }
}

public class Worker
{
   public static void Main()
   {
       MyThread my = new MyThread(10,20);
       my.Start();
       Thread.Sleep(5000);
       Console.WriteLine("Finished");
   }
}


Данный пример в принципе должен давать исчерпывающие ответ.
Видно, что теперь мы можем передавать любое количество параметров понятным способом. Во всяком случае мне гораздо проще использовать такой подход, нежели который предлагает Microsoft.

Я не гарантирую, что кто-то такое уже не придумал, но пусть эта информация не пропадет.

Автор: pa6kevi4 24.6.2010, 10:13
А что делать, если ваш метод MyHandle() с параметрами?
Допустим, public void MyHandle(string message, MessageType messageType)
Как тогда запустить поток?

Автор: mihryak 24.6.2010, 12:15
что-то вы усложняете
если не нужно возвращаемое значение, нет необходимости дожидаться окончания, то прекрасно подойдёт Action
функциональность обоих примеров (+ произвольное количество параметров, + возможность использовать замыкания) повторяет такой код
Код

    class ThreadExecutor
    {
        public void Execute(Action action)
        {
            new Thread(() => action()).Start();
        }
    }

    class Program
    {
        private static void Method(int a, int b)
        {
            Console.Write("{0} + {1} = {2}", a, b, a + b);
        }

        private static void Main()
        {
            int a = 2;
            int b = 3;

            new ThreadExecutor().Execute(() => Method(a, b));
            Thread.Sleep(1000);
            Console.ReadKey();
        }
    }


пс. откуда у темы 1782 просмотров?   smile 
ппс. посмотрел на дату smile

Автор: VirusUZ 25.6.2010, 12:09
private void button1_Click(object sender, EventArgs e)
        {
            System.Threading.ThreadPool.QueueUserWorkItem(new WaitCallback(salom));
        }
        void salom(object virus)
        {
            MessageBox.Show("rahim");
        }

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)