[C#]Rxでsubscribeされた場所を探す
Rxで拡張メソッドを書いてた時に困ったことについて記載します。
あまり一般的な話ではないので誰得感がありますが…
例えば以下の拡張メソッドがあるとします。
static class Extensions
{
public static IObservable<string> Filter(this IObservable<string> source, string v)
{
return source.Where(s => s == v);
}
}
あんまり意味のない関数ですが単純に渡した文字列と等しい場合だけ後続に値を流すIObservable
を作る関数です。
この関数を例えば以下のように使ってるとします。
static void Hogehoge(IObservable<string> source)
{
source.Filter("test")
.Subscribe(s => Console.WriteLine(s));
}
Filter
関数を使ってIObservable
を作った後にSubscribe
しているだけです。
ここまでは特に問題がないのですがプログラムが巨大になっていく中でObservable
に値を流しているはずなのに最終的な場所まで値がやってこないということが起こりました。
原因がよくわからず、仕方ないので値を流している部分からステップインで先に進んでいって途切れている場所を探すという手法をとることにしました。
そこでとても残念なことになりました。
このFilter
を呼び出したのが誰なのかが全く分かりません。
スタックトレースも全く役に立ちません。
この状況で誰がFilter
を呼び出したのか(=誰がSubscribe)しているのかをどうにかして探し出す必要がありました。
色々考えましたが最終的には以下のようにFilter
関数を改造しました。
public static IObservable<string> Filter(this IObservable<string> source, string v)
{
var st = Environment.StackTrace;
return source.Where(s =>
{
Console.WriteLine(st);
return s == v;
});
}
Filter
を実行したときのスタックトレースをキャプチャして表示することでどこから実行されたかが一目瞭然になりました。
最後に
もっといい方法があれば教えてください。
Author And Source
この問題について([C#]Rxでsubscribeされた場所を探す), 我々は、より多くの情報をここで見つけました https://qiita.com/yaegaki/items/a7fee9f7e6a6ed15fb9e著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .