При запуске нового потока в С++ ему передается в качестве аргумента указатель (void*), в который размещаются все необходимые данные.
При запуске нового потока в C# используется делегат ThreadStart(), который аргументов не принимает. Передать данные я смог только через статические поля класса, метод которого использовался для запуска потока.
Есть ли возможность запустить новый поток в C#, передав ему в каческве аргумента object?
Если есть, то как?
Здравствуйте, <Аноним>, Вы писали:
А>При запуске нового потока в С++ ему передается в качестве аргумента указатель (void*), в который размещаются все необходимые данные. А>При запуске нового потока в C# используется делегат ThreadStart(), который аргументов не принимает. Передать данные я смог только через статические поля класса, метод которого использовался для запуска потока.
А>Есть ли возможность запустить новый поток в C#, передав ему в каческве аргумента object? А>Если есть, то как?
Здравствуйте, Аноним, Вы писали:
А>Есть ли возможность запустить новый поток в C#, передав ему в каческве аргумента object? А>Если есть, то как?
public void Start (object parameter)
О так?
Многопоточность
От:
Аноним
Дата:
05.09.06 09:39
Оценка:
public class Main
{
public Main()
{
CustomThread customThread = new CustomThread(new string[]{"1", "2", "3"});
Thread thread = new Thread(new ThreadStart(customThread.Start));
}
public void ThreadWorker()
{
}
}
public class CustomThread
{
private object _data;
public object Data
{
get
{
return _data;
}
}
public CustomThread(object data)
{
this._data = data;
}
public void Start()
{
// do smth with _data
}
}
Error 5 The call is ambiguous between the following methods or properties: 'System.Threading.Thread.Thread(System.Threading.ThreadStart)' and 'System.Threading.Thread.Thread(System.Threading.ParameterizedThreadStart)'
Здравствуйте, UFB, Вы писали:
UFB>Здравствуйте, AndrewVK, Вы писали:
AVK>>Здравствуйте, <Аноним>, Вы писали:
AVK>>Еще один вариант — использовать замыкание:
AVK>>
Это все конечно круто, но вот только работать не будет. т.к. замыканий в C# пока нет
string str = "This is a test!";
ThreadStart ts = new ThreadStart(delegate() { Method(str); });
Thread t = new Thread(ts);
str = "This is a second test!";
t.Start();
t.Join();
static void Method(string str)
{
Console.WriteLine(str);
}
Здравствуйте, Lloyd, Вы писали:
ie>>Это все конечно круто, но вот только работать не будет. т.к. замыканий в C# пока нет ie>>
ie>> string str = "This is a test!";
ie>> ThreadStart ts = new ThreadStart(delegate() { Method(str); });
ie>> Thread t = new Thread(ts);
ie>> str = "This is a second test!";
ie>> t.Start();
ie>> t.Join();
ie>> static void Method(string str)
ie>> {
ie>> Console.WriteLine(str);
ie>> }
ie>>
L>Вау, это новое слово в аргументировании — приводит пример замыкания для доказательсятва отсутствия оных.
Вот когда этот пример выведет в консоль "This is a test!", тогда это будут замыкания, а пока выводит "This is a second test!", это пример отсутсвия оных
Здравствуйте, AndrewVK, Вы писали:
ie>>Это все конечно круто, но вот только работать не будет. т.к. замыканий в C# пока нет
AVK>Если ты не знаешь особенностей строк в дотнете, то это не значит что там замыканий нет.
А какая такая особенность строк здесь используется?
Здравствуйте, AndrewVK, Вы писали:
ie>>Это все конечно круто, но вот только работать не будет. т.к. замыканий в C# пока нет AVK>Если ты не знаешь особенностей строк в дотнете, то это не значит что там замыканий нет.
А причем тут собственно строки? Я могу вместо строки взять любой другой объект, результат от этого не изменется.
Здравствуйте, ie, Вы писали:
L>>Вау, это новое слово в аргументировании — приводит пример замыкания для доказательсятва отсутствия оных.
ie>Вот когда этот пример выведет в консоль "This is a test!", тогда это будут замыкания, а пока выводит "This is a second test!", это пример отсутсвия оных
Нет, это не отсутствие оных, а непонимание того, что такое замыкание. Замыкание захватывает переменную, а не её значение.
Здравствуйте, Lloyd, Вы писали:
L>>>Вау, это новое слово в аргументировании — приводит пример замыкания для доказательсятва отсутствия оных. ie>>Вот когда этот пример выведет в консоль "This is a test!", тогда это будут замыкания, а пока выводит "This is a second test!", это пример отсутсвия оных L>Нет, это не отсутствие оных, а непонимание того, что такое замыкание. Замыкание захватывает переменную, а не её значение.
Здравствуйте, ie, Вы писали:
ie>А причем тут собственно строки?
А при чем тут собственно то, что в C# замыкания read-only? Вопрос был про передачу параметров в поток, а не про возврат оттуда.
При необходимости всегда можно передать mutable объект (C# ведь не функциональный язык, в нем это вполне естественно) и менять его, не меняя ссылки. Но к исходному вопросу это никакого отношения не имеет.
Здравствуйте, AndrewVK, Вы писали:
ie>>А причем тут собственно строки? AVK>А при чем тут собственно то, что в C# замыкания read-only? Вопрос был про передачу параметров в поток, а не про возврат оттуда.
Дык, я оттуда ничего вернуть и не пытаюсь. Разве не так?
AVK>При необходимости всегда можно передать mutable объект (C# ведь не функциональный язык, в нем это вполне естественно) и менять его, не меняя ссылки. Но к исходному вопросу это никакого отношения не имеет.
Мы уже с Lloyd выяснили, что я не правильно понимал замыкания. Я полагал, что используется значение которое было в момент создания делегата, а не в момент его вызова. Оказалось ровно наоборот.