Dispatch.Invoke(новое действие...) с параметром
Раньше у меня был
Dispatcher.Invoke(new Action(() => colorManager.Update()));
чтобы обновить отображение в WPF из другого потока. Из-за дизайна мне пришлось изменить программу, и я должен передать параметр ColorImageFrame в свой метод ColorStreamManager.Update().
Следуя этой ссылке, я изменил свой диспетчер на:
Dispatcher.Invoke(new Action<ColorStreamManager, ColorImageFrame>((p,v) => p.Update(v)));
Он компилируется отлично, но не запускается вообще. VS2010 говорит "Несоответствие счетчика параметров". В моем методе ColorStreamManager.Update()
у меня есть
RaisePropertyChanged(() => Bitmap)
;
Может ли кто-нибудь указать, где я ошибся?
Подпись метода ColorStreamManager.Update()
заключается в следующем:
public void Update(ColorImageFrame frame);
Ответы
Ответ 1
Вы не хотите, чтобы действие имело параметры, потому что Dispatcher
не будет знать, что передать методу. Вместо этого вы можете закрыть эту переменную:
ColorImageFrame someFrame = ...;
Dispatcher.Invoke(new Action(() => colorManager.Update(someFrame)));
Ответ 2
Если вы вызываете Invoke
с делегатом Action<T1, T2>
, вам необходимо передать два параметра Action для вызова Invoke:
ColorStreamManager colorManager = ...
ColorImageFrame frame = ...
Dispatcher.Invoke(
new Action<ColorStreamManager, ColorImageFrame>((p,v) => p.Update(v)),
colorManager,
frame);
Перегрузка вызова, используемая здесь, Dispatcher.Invoke(Delegate, Object[])
.