Jak używać Observable.FromEvent zamiast FromEventPattern i unikać nazw zdarzeń literału ciągu

Uczę się na temat Rx w WinForms i mam następujący kod:

// 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's display
groupedKeyPresses.Subscribe(keyPressGroup =>
{
    var numPresses = 0;
    keyPressGroup.Subscribe(key => UpdateKeyPressStats(key, ++numPresses));
});

Działa / działa doskonale, strumieniuje w zdarzeniach KeyPress, grupy po naciśnięciu klawisza, a następnie śledzi, ile razy każdy klawisz został wciśnięty i wywołujeUpdateKeyPressStats metoda z kluczem i nową liczbą naciśnięć. Wyślij to!

Jednak nie jestem fanem tegoFromEventPattern podpis, ze względu na literalne odniesienie do zdarzenia. Pomyślałem, że spróbujęFromEvent zamiast.

// 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's display
groupedKeyPresses.Subscribe(keyPressGroup =>
{
    var numPresses = 0;
    keyPressGroup.Subscribe(key => UpdateKeyPressStats(key, ++numPresses));
});

Więc jedyną zmianą była wymianaObservable.FromEventPattern zObservable.FromEvent (i ścieżka wSelect Zapytanie LINQ, aby uzyskaćKeyChar). Reszta, w tymSubscribe metody są identyczne. Jednak w czasie wykonywania z drugim rozwiązaniem otrzymuję:

W mscorlib.dll wystąpił nieobsługiwany wyjątek typu „System.ArgumentException”

Informacje dodatkowe: Nie można powiązać z metodą docelową, ponieważ jej podpis lub przezroczystość zabezpieczeń nie jest zgodna z metodą typu delegata.

Co powoduje ten wyjątek środowiska wykonawczego i jak go unikać?

GUI: WinFormsWersja Rx i Rx-WinForm: 2.1.30214.0 (przez Nuget)Ramy docelowe: 4.5

questionAnswers(1)

yourAnswerToTheQuestion