Вопрос о поточной обработке.NET

Есть ли любое существенное различие между этим кодом:

ThreadStart starter = new ThreadStart(SomeMethod);
starter.Invoke();

и это?

ThreadStart starter = new ThreadStart(SomeMethod);
Thread th = new Thread(starter);
th.Start();

Или первое вызывает метод на текущий поток, в то время как второе вызывает его на новый поток?

6
задан John Saunders 13 June 2010 в 08:39
поделиться

2 ответа

Они не то же самое.

Вызов new ThreadStart (SomeMethod) .Invoke () выполнит метод в текущем потоке с использованием позднего связывания. Это намного медленнее, чем new ThreadStart (SomeMethod) () , который, в свою очередь, немного медленнее, чем SomeMethod () .

Вызов new Thread (SomeMethod) .Start () создаст новый поток (со своим собственным стеком), запустит метод в потоке, а затем уничтожит поток.

Вызов ThreadPool.QueueUserWorkItem (делегат {SomeMethod ();}) (который вы не упомянули) запустит метод в фоновом режиме в пуле потоков, который представляет собой набор потоков, управляемых автоматически. на .Net, на котором вы можете запускать код. Использование ThreadPool намного дешевле, чем создание нового потока.

Вызов BeginInvoke (о котором вы также не упомянули) также запустит метод в фоновом режиме в пуле потоков и сохранит информацию о результате метода, пока вы не вызовете EndInvoke . (После вызова BeginInvoke вы должны вызвать EndInvoke )

Как правило, лучшим вариантом является ThreadPool.QueueUserWorkItem .

13
ответ дан 8 December 2019 в 14:42
поделиться

В случае, если ответ SLaks не совсем ясен:

вызывает ли первый метод в текущем потоке, а второй вызывает это в новой ветке?

Да.

3
ответ дан 8 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: