EventLoopScheduler
(少なくとも1つの作業キューに項目がある)でDispose
を呼び出すと、ObjectDisposedException
がスローされます。例外はワーカースレッドからスローされます。EventLoopScheduler:Disposeで予期しない動作が発生するObjectDisposedException
私が見て、すでに存在して二つの質問を読んだ:しかし、私はを引用、答えのいくつかは、非常に正確ではないと思います
- RX2.0: ObjectDisposedException after diposing EventLoopSchedulerを、
- Reactive Rx 2.0 EventLoopScheduler ObjectDisposedException after dispose
をEventLoopSchedulerに関するRxの紹介:
EventLoopSchedulerはIDisposableを実装しており、Disposeを呼び出すとスレッドが終了することができます。 IDisposableの実装と同様に、作成するリソースのライフタイムを明示的に管理することが適切です。
出典:http://introtorx.com/Content/v1.0.10621.0/15_SchedulingAndThreading.html#EventLoopScheduler
彼らが正しくEventLoopScheduler
を使用する方法についての例を提供します。
Observable
.Using(()=>new EventLoopScheduler(), els=> GetPrices(els))
.Subscribe(...)
残念ながら、この例では:-)少なくともではない私にとっては(動作しません。コードのこの部分を考える:
internal class Program
{
private static void Main(string[] args)
{
var source = new Subject<string>();
var subscription = Observable.Using(
() => new EventLoopScheduler(),
scheduler => source
.ObserveOn(scheduler)
.Do(LongRunningAction))
.Subscribe();
source.OnNext("First action (2 seconds)");
Thread.Sleep(TimeSpan.FromSeconds(1));
subscription.Dispose(); // Scheduler is still busy!
Console.ReadLine();
}
private static void LongRunningAction(string text) {
Thread.Sleep(TimeSpan.FromSeconds(2));
Console.WriteLine(text);
}
}
私は(サブスクリプションが1秒後に配置されているにもかかわらず)エラーなし2秒後にテキストメッセージを参照してください期待されます。 EventLoopScheduler
は進行中の操作をキャンセルすることはできません。それは私にとっては大丈夫です。
あなたが実際に手に入れたのは、メッセージで、未処理のObjectDisposedException
です。
これはバグですか、それとも間違っていますか? :-)
この例外を回避するには、現在EventLoopScheduler
をラップし、scheduler.Schedule(() => scheduler.Dispose())
をwrapper.Dispose()
に呼び出してください。
私はあなたがリンクしたという私の答えを見直しました。本当に追加すべきものが何であるかわからない - 例外の根拠についてはかなり徹底的に説明していると思う。 –
こんにちはジェームズ、あなたのコメントありがとう! 1.あなたは書いています_私はそれが 'IDisposable'を実装しているので真実ではないと思っています。これらのスケジューラーを処分しないと、多くのオープンスレッドが発生します。スケジューラーは** **ガベージコレクションではありません。そのため、私はObservable.Using'を使って提案されたパターンを使用したのです。2. LongRunningActionは単なる例でした。マルチスレッド環境では、どのくらい時間がかかるかは分かりません。登録解除がいつ行われるかは誰にも知られていません。 –
OK、あなたはあなたの邪悪な半引用符で私を広げてしまった。 :)私の答えを参照してください。 –