Соответствующая информация:
1. Перегрузка Dispatcher.BeginInvoke
, которую вы используете:
public DispatcherOperation BeginInvoke(
DispatcherPriority priority,
Delegate method,
Object arg
)
method
: делегат метода , который принимает один аргумент , который помещается в очередь событий Dispatcher.
2. Делегат SendOrPostCallBack
объявлен как:
public delegate void SendOrPostCallback(object state)
3.Как для Action
:
public delegate void Action()
Очевидно, что делегат SendOrPostCallBack
совместим, поскольку он принимает один аргумент, а Action
- нет, поскольку он не имеет параметров.
Конечно, вы можете использовать делегат Action<T>
, который принимает один аргумент, если вы предпочитаете:
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action<States>(arg => SetValue(StateProperty, arg)),
value);
Кроме того, вы можете использовать другую перегрузку из Dispatcher.BeginInvoke
, которая ожидает аргумент типа делегата, который принимает no аргументов, и заставить компилятор C # сделать грязная работа для вас в закрытии:
Dispatcher.BeginInvoke(DispatcherPriority.Background,
new Action(() => SetValue(StateProperty, value));
Обратите внимание, что value
является захваченной переменной, поэтому, пожалуйста, будьте осторожны.
(Кроме того, в этом ответе не рассматриваются какие-либо проблемы безопасности потоков, речь идет только о соответствующих сигнатурах делегатов.)