Как создать тему? - PullRequest
48 голосов
/ 01 мая 2009

Метод ниже - это то, что я хочу сделать в этой теме:

public void Startup(int port,string path)
{
    Run(path);
    CRCCheck2();
    CRCCheck1();
    InitializeCodeCave((ushort)port);
}

Я пытался найти то, что мог найти, но ничего не помогло

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

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

Ответы [ 5 ]

71 голосов
/ 01 мая 2009

Работают следующие способы.

// 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);
11 голосов
/ 21 декабря 2015

Обновление Предлагаемый в настоящее время способ запуска Задачи - просто использовать Task.Run ()

Task.Run(() => foo());

Обратите внимание, что этот метод описан как лучший способ запуска задачи см. Здесь

Предыдущий ответ

Мне нравится Фабрика задач из System.Threading.Tasks. Вы можете сделать что-то вроде этого:

Task.Factory.StartNew(() => 
{
    // Whatever code you want in your thread
});

Обратите внимание, что фабрика задач предоставляет вам дополнительные удобные опции, такие как ContinueWith :

Task.Factory.StartNew(() => {}).ContinueWith((result) => 
{
    // Whatever code should be executed after the newly started thread.
});

Также обратите внимание, что задача - это немного другое понятие, чем потоки. Они хорошо сочетаются с ключевыми словами async / await, см. здесь .

8 голосов
/ 01 мая 2009

Метод, который вы хотите запустить, должен быть ThreadStart Делегат . Пожалуйста, обратитесь к Thread документации на MSDN. Обратите внимание, что вы можете как бы создать свой старт с двумя параметрами с закрытием. Что-то вроде:

var t = new Thread(() => Startup(port, path));

Обратите внимание, что вы, возможно, захотите пересмотреть доступность вашего метода. Если бы я увидел, как класс запускает поток для своего открытого метода таким образом, я был бы немного удивлен.

4 голосов
/ 01 мая 2009

Ваш пример терпит неудачу, потому что методы 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);
}
2 голосов
/ 01 мая 2009
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 и передайте его методу запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...