Есть ли любое существенное различие между этим кодом:
ThreadStart starter = new ThreadStart(SomeMethod);
starter.Invoke();
и это?
ThreadStart starter = new ThreadStart(SomeMethod);
Thread th = new Thread(starter);
th.Start();
Или первое вызывает метод на текущий поток, в то время как второе вызывает его на новый поток?
Они не то же самое.
Вызов new ThreadStart (SomeMethod) .Invoke ()
выполнит метод в текущем потоке с использованием позднего связывания. Это намного медленнее, чем new ThreadStart (SomeMethod) ()
, который, в свою очередь, немного медленнее, чем SomeMethod ()
.
Вызов new Thread (SomeMethod) .Start ()
создаст новый поток (со своим собственным стеком), запустит метод в потоке, а затем уничтожит поток.
Вызов ThreadPool.QueueUserWorkItem (делегат {SomeMethod ();})
(который вы не упомянули) запустит метод в фоновом режиме в пуле потоков, который представляет собой набор потоков, управляемых автоматически. на .Net, на котором вы можете запускать код. Использование ThreadPool намного дешевле, чем создание нового потока.
Вызов BeginInvoke
(о котором вы также не упомянули) также запустит метод в фоновом режиме в пуле потоков и сохранит информацию о результате метода, пока вы не вызовете EndInvoke
. (После вызова BeginInvoke
вы должны вызвать EndInvoke
)
Как правило, лучшим вариантом является ThreadPool.QueueUserWorkItem
.
В случае, если ответ SLaks не совсем ясен:
вызывает ли первый метод в текущем потоке, а второй вызывает это в новой ветке?
Да.