Я изучаю свой путь вокруг Rx в WinForms и имею следующий код:
// Create an observable from key presses, grouped by the key pressed
var groupedKeyPresses = Observable.FromEventPattern<KeyPressEventArgs>(this, "KeyPress")
.Select(k => k.EventArgs.KeyChar)
.GroupBy(k => k);
// Increment key counter and update user display
groupedKeyPresses.Subscribe(keyPressGroup =>
{
var numPresses = 0;
keyPressGroup.Subscribe(key => UpdateKeyPressStats(key, ++numPresses));
});
Это работает/отлично работает, потоки в событиях KeyPress, группах нажатием клавиши, а затем отслеживает, сколько раз каждый ключ был нажат, и вызывает метод UpdateKeyPressStats
с ключом и новым числом нажатий. Отправляй это!
Тем не менее, я не являюсь поклонником подписи FromEventPattern
, из-за ссылки на литералы по строкам. Итак, я решил, что попробую FromEvent
.
// Create an observable from key presses, grouped by the key pressed
var groupedKeyPresses = Observable.FromEvent<KeyPressEventHandler, KeyPressEventArgs>(h => this.KeyPress += h, h => this.KeyPress -= h)
.Select(k => k.KeyChar)
.GroupBy(k => k);
// Increment key counter and update user display
groupedKeyPresses.Subscribe(keyPressGroup =>
{
var numPresses = 0;
keyPressGroup.Subscribe(key => UpdateKeyPressStats(key, ++numPresses));
});
Итак, единственное изменение заключалось в замене Observable.FromEventPattern
на Observable.FromEvent
(и путь в запросе Select
LINQ для получения KeyChar
). Остальные, включая методы Subscribe
, идентичны. Однако во время выполнения со вторым решением я получаю:
Необработанное исключение типа "System.ArgumentException" произошло в mscorlib.dll
Дополнительная информация: не может привязываться к целевому методу, поскольку его прозрачность подписи или безопасности несовместима с таковой тип делегата.
Что вызывает это исключение во время выполнения и как его избежать?
- GUI: WinForms
- Rx и Rx-WinForms Версия: 2.1.30214.0 (через Nuget)
- Целевая структура: 4.5