Разница между ThreadStart и Action

Кто-нибудь знает разницу между

Dispatcher.BeginInvoke(DispatcherPriority.Background, new ThreadStart(() =>
{

и

Dispatcher.BeginInvoke(DispatcherPriority.Background, new Action(() =>
{

Ответ 1

Не должно быть разницы. ThreadStart и Action определяются как

public delegate void ThreadStart();

public delegate void Action();

i.e., делегат без параметров и никакого возвращаемого значения. Таким образом, они семантически одинаковы.


Однако я бы использовал Action, а не ThreadStart, поскольку ThreadStart сильно связан с конструктором Thread, поэтому код с ThreadStart может намекать на прямое создание потоков и, следовательно, слегка вводить в заблуждение.

Ответ 2

Похоже, что существует разница между ThreadStart и Action в контексте BeginInvoke.

Они оба будут правильно выполнять код внутри делегата, как сказал Влад.

Однако, если в делегате возникает исключение, ThreadStart приводит к TargetInvocationException. Но использование Action дает вам правильное исключение из делегата.

Action должно быть предпочтительным по этой причине.

Посмотрите этот вопрос.