Как создать поток?
Ниже приведен метод, который я хочу сделать в этом потоке:
public void Startup(int port,string path)
{
Run(path);
CRCCheck2();
CRCCheck1();
InitializeCodeCave((ushort)port);
}
Я пробовал, что мог найти googling, но ничего не работало
public void Test(int port,string path)
{
Thread t = new Thread(Startup(port,path));
}
public void TestA(int port,string path)
{
Thread t = new Thread(Startup);
t.Start (port,path);
}
Оба не компилируются, как это сделать?
Ответы
Ответ 1
Следующие способы работы.
// The old way of using ParameterizedThreadStart. This requires a
// method which takes ONE object as the parameter so you need to
// encapsulate the parameters inside one object.
Thread t = new Thread(new ParameterizedThreadStart(StartupA));
t.Start(new MyThreadParams(path, port));
// You can also use an anonymous delegate to do this.
Thread t2 = new Thread(delegate()
{
StartupB(port, path);
});
t2.Start();
// Or lambda expressions if you are using C# 3.0
Thread t3 = new Thread(() => StartupB(port, path));
t3.Start();
Для этих примеров в методах запуска есть следующая подпись.
public void StartupA(object parameters);
public void StartupB(int port, string path);
Ответ 2
Метод, который вы хотите запустить, должен быть ThreadStart
Delegate. Пожалуйста, обратитесь к Thread
документации в MSDN. Обратите внимание: вы можете создать двухзадачный запуск с закрытием. Что-то вроде:
var t = new Thread(() => Startup(port, path));
Обратите внимание, что вам может потребоваться пересмотреть доступность вашего метода. Если бы я видел класс, начинающий поток по собственному публичному методу таким образом, я был бы немного удивлен.
Ответ 3
Мне нравится Task Factory из System.Threading.Tasks. Вы можете сделать что-то вроде этого:
Task.Factory.StartNew(() =>
{
// Whatever code you want in your thread
});
Обратите внимание, что задача Factory предоставляет дополнительные параметры удобства, такие как ContinueWith:
Task.Factory.StartNew(() => {}).ContinueWith((result) =>
{
// Whatever code should be executed after the newly started thread.
});
Также обратите внимание, что задача - это немного другое понятие, чем потоки. Они прекрасно подходят для ключевых слов async/wait, см. здесь.
Ответ 4
public class ThreadParameter
{
public int Port { get; set; }
public string Path { get; set; }
}
Thread t = new Thread(new ParameterizedThreadStart(Startup));
t.Start(new ThreadParameter() { Port = port, Path = path});
Создайте объект с объектами port и path и передайте его методу Startup.
Ответ 5
Ваш пример не выполняется, потому что методы Thread принимают один или нулевые аргументы. Чтобы создать поток без прохождения аргументов, ваш код выглядит следующим образом:
void Start()
{
// do stuff
}
void Test()
{
new Thread(new ThreadStart(Start)).Start();
}
Если вы хотите передать данные в поток, вам необходимо инкапсулировать ваши данные в один объект, независимо от того, является ли это пользовательским классом вашего собственного дизайна или объект словаря или что-то еще. Затем вам необходимо использовать делегат ParameterizedThreadStart, например:
void Start(object data)
{
MyClass myData = (MyClass)myData;
// do stuff
}
void Test(MyClass data)
{
new Thread(new ParameterizedThreadStart(Start)).Start(data);
}