Здравствуйте, Аноним, Вы писали:
А>При запуске нового потока в С++ ему передается в качестве аргумента указатель (void*), в который размещаются все необходимые данные. А>При запуске нового потока в C# используется делегат ThreadStart(), который аргументов не принимает. Передать данные я смог только через статические поля класса, метод которого использовался для запуска потока.
А>Есть ли возможность запустить новый поток в C#, передав ему в каческве аргумента object? А>Если есть, то как?
Люди, а что велик-то изобретаем?! Для этого в каждом потоке есть слоты данных.
А именно:
1. создал поток (он ещё не запущен)
2. создал слот
3. записал в слот
4. запустил поток
5. получил данные из запущенного потока Thread.CurrentThread.GetData (...)
6. убил слот
Да тут все еще проще. На самом деле в дотнете 2.0, на котором изначально приводились примеры кода есть делегат ParameterizedThreadStart, который как и позволяет прекрасно решить обозначенную в первом топике задачу — без всяких там замыканий, слотов и другой медвежути.
Здравствуйте, <Аноним>, Вы писали:
А>Есть ли возможность запустить новый поток в C#, передав ему в каческве аргумента object? А>Если есть, то как?
можно так:
class TEST
{
static public void Main()
{
MyThreadData td = new MyThreadData();
td.str = "This is a test!";
Thread t = new Thread(td.threadProc);
t.Start();
t.Join();
}
class MyThreadData
{
public string str;
public void threadProc()
{
Console.WriteLine("{0}", str);
}
}
}
Тот кто знает не говорит, тот кто говорит не знает.
Здравствуйте, Streamer1, Вы писали:
S>объясните плиз: S>
S>delegate { Method(str); }
S>
S>что при этом реально происходит?
Реально компилятор генерит класс, который инкапсулирует все поля, которые используются в замыкании. Т.е. после компиляции приведенный мной код превратится примерно в следующее:
private static void Method(string str)
{
Console.WriteLine(str);
}
private static void Main(string[] args)
{
Temp temp = new Temp();
temp.str = "This is a test!";
ThreadStart start1 = new ThreadStart(temp.Method);
Thread thread1 = new Thread(start1);
temp.str = "This is a second test!";
thread1.Start();
thread1.Join();
Console.ReadLine();
}
private sealed class Temp
{
public string str;
public void Method()
{
Test.Method(str);
}
}
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Да тут все еще проще. На самом деле в дотнете 2.0, на котором изначально приводились примеры кода есть делегат ParameterizedThreadStart, который как и позволяет прекрасно решить обозначенную в первом топике задачу — без всяких там замыканий, слотов и другой медвежути.
Замыкание позволяет обойтись без приведений типов.
Здравствуйте, ie, Вы писали:
ie>Реально компилятор генерит класс, который инкапсулирует все поля, которые используются в замыкании. Т.е. после компиляции приведенный мной код превратится примерно в следующее: ie>
...
ie> private sealed class Temp
ie> {
ie> public string str;
ie> public void Method()
ie> {
ie> Test.Method(str);
ie> }
ie> }
ie>
хм... а я такой класс сам пишу в таких случаях
Тот кто знает не говорит, тот кто говорит не знает.