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