1

私はまだ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() を実行するため、現在のスレッドがブロックされるため、タスクに信号を送信することはできません。戻る。すべてのポイントは、長期にわたるデータ収集をシミュレートし、変更検出が起動しないことを確認することでした。

私の質問は次のとおりです。私のニーズに対するよりエレガントなソリューションはありますか?

4

1 に答える 1

0

Task.Wait現在のスレッドを使用してブロックする代わりに、

補完コードは続きで書いたほうがいいかもしれません。すなわち、使用しますTask.ContinueWith(_ => recursive(...))

于 2013-02-20T09:44:43.237 に答える