Вы имеете в виду Delegate.Invoke / BeginInvoke или Control.Invoke / BeginInvoke?
В ответе Тима упоминается, когда вы, возможно, захотите использовать BeginInvoke - хотя, я подозреваю, он был в основном ориентирован на Delegate.BeginInvoke.
Для приложений Windows Forms я бы посоветовал вам обычно использовать BeginInvoke. Таким образом, вам не нужно беспокоиться о взаимоблокировке, например, - но вы должны понимать, что пользовательский интерфейс, возможно, не был обновлен, когда вы в следующий раз посмотрите на него! В частности, вы не должны изменять данные, которые поток пользовательского интерфейса может использовать для отображения. Например, если у вас есть свойства Person со значениями FirstName и LastName, и вы сделали:
person.FirstName = "Kevin"; // person is a shared reference
person.LastName = "Spacey";
control.BeginInvoke(UpdateName);
person.FirstName = "Keyser";
person.LastName = "Soze";
, тогда пользовательский интерфейс может в конечном итоге отобразить «Keyser Spacey». (Существует внешняя вероятность, что он может отобразить «Кевин Созе», но только из-за странности модели памяти.)
Однако, если у вас нет такой проблемы, Control.BeginInvoke будет проще понять, и будет Избегайте фоновой ветки от необходимости ждать без веской причины. Обратите внимание, что команда Windows Forms гарантировала, что вы можете использовать Control.BeginInvoke в режиме «запускай и забывай», то есть никогда не вызывая EndInvoke. Это не относится к асинхронным вызовам в целом: обычно каждый BeginXXX должен иметь соответствующий вызов EndXXX, обычно в обратном вызове.
ps aux | grep node
kill -9 [PID] (provided by above command)
Описание: