私はまだRxに苦労しています。今回は Observable.Interval に問題があります。
私の要件は次のとおりです。
- 1 秒ごとにデータ収集を実行する必要があります。
- パラメータの変更を 5 秒ごとに確認する必要があります。
- 変更をチェックしている間、データを収集できません。
- データ収集または変更のチェックに 1 秒以上かかる場合は、それらのティックをキューに入れず、スキップしてください。
- データ収集の進行中に変更チェックティックが発生した場合、実行を待機する必要があります。
インターバルに Observables を使用してみましたが、デフォルトで Intervals が見逃したティックをキューに入れることがわかりました! 最後に、コンソール アプリ全体を作成した後、必要なものを示す例を見つけました。この実装は、Scheduler.NewThread でのみ機能するようです。私の新しい問題は、テスト スケジューラが CurrentThread のように見えるため、この実装をまったくテストできないことです。
マイ コンソール アプリのサンプル コード:
var otherThreadScheduler = Scheduler.NewThread;
cancel = otherThreadScheduler.Schedule(
TimeSpan.FromSeconds(1),
recursive =>
{
lock (obj)
{
Console.WriteLine(
"Processing Data - Thread ID = " + Thread.CurrentThread.ManagedThreadId);
var t = new Task(
() =>
{
Console.WriteLine(
"Hi I'm the task on thread {0}",
Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(2000);
});
t.Start();
Console.WriteLine(
"Processing Data Waiting for it to finish - Thread ID = "
+ Thread.CurrentThread.ManagedThreadId);
t.Wait();
}
Console.WriteLine("Processing Data finished - Thread ID = " + Thread.CurrentThread.ManagedThreadId);
recursive(TimeSpan.FromSeconds(1));
});
cancel2 = otherThreadScheduler.Schedule(
TimeSpan.FromSeconds(1),
recursive =>
{
lock (obj)
{
Console.WriteLine("Processing Detection - Thread ID = " + Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10000);
}
recursive(TimeSpan.FromSeconds(5));
});
これがテストできない理由は、実際のコードのタスクがモック可能であるため、停止するように信号を送るまでループするようにモックしますが、コードが task.Wait() を実行するため、現在のスレッドがブロックされるため、タスクに信号を送信することはできません。戻る。すべてのポイントは、長期にわたるデータ収集をシミュレートし、変更検出が起動しないことを確認することでした。
私の質問は次のとおりです。私のニーズに対するよりエレガントなソリューションはありますか?