Подтвердить что ты не робот

Как создать поток?

Ниже приведен метод, который я хочу сделать в этом потоке:

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

Оба не компилируются, как это сделать?

4b9b3361

Ответ 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);
}