2

非常にクールで目的にかなう ReactiveUI の ReactiveCommand 機能を使用しています。私が抱えている唯一の問題は、インスタンス化されたときの ReactiveCommand には IScheduler の実装が必要であり、現在は MainThreadScheduler と TaskPoolScheduler の 2 つしか提供されておらず、両方とも ReactiveCommand インスタンスごとに個別のスレッドを作成できますが、アプリケーションには膨大な量の ReactiveCommand インスタンスがあるため、余裕がありません。 .

そこで、ReactiveCommand コンストラクターに渡すことができる独自の IScheduler 実装を用意することにしました。MaxThread スレッドを超えることはできません。

私が考えることができる2つの方法があります

  1. アプリケーションが起動するたびに、これらのスレッドを開始し、ActionBlock からタスクを削除しようとして待機状態にします。Schedule が呼び出されると、その Action オブジェクトを ActionBlock インスタンスに追加します。

  2. Create と Destroy。基本的には 1 と同じですが、タスクが完了すると、スレッドを存続させずに終了します。

これをどのように達成すべきかについて誰か提案がありますか? 入力、コードサンプル、記事へのリンク、または Github/Codeplex の何かをいただければ幸いです。

4

3 に答える 3

2

デフォルトのスケジューラで長時間実行されるタスクで新しいスレッドを開始したくない場合は、次のISchedulerLongRunningように最適化を無効にしてデフォルトのスケジューラを使用できます。

Scheduler.Default.DisableOptimizations(typeof(ISchedulerLongRunning));

ObserveOnこれを行わないと、サブスクリプションごとに新しいスレッドが作成されます

于 2016-02-15T09:12:09.510 に答える
1

では、なぜ ThreadPool にキックアウトする DefaultScheduler を使用したくないのでしょうか?

また、内部で何かが を呼び出しScheduleLongRunning()ている場合、とにかくこれがあなたが望むものであると確信していますか? 複雑なドメインであるコンボイとスレッド競合を導入する可能性があるようです.

たぶん、あなたが実際にやろうとしていることは、

  1. スレッドプールを準備して、スレッドを追加する必要があるときに一時停止しないようにします
  2. アプリケーションのより優れた同時実行設計を作成します。UI から一度に 80 個のものがすべてスケジュールされている場合、何かが正しくないように思えます。

ポールはいくらかの洞察を持っていると思いますか?

于 2013-09-08T22:04:46.797 に答える
0

.NET の ThreadPool で IScheduler を実装し、ThreadPool の最大スレッド数を簡単に設定します。

コード プロジェクトには ThreadPool の実装がいくつかあります。そうでない場合は、それらを使用できます。

.NET の既定のアプリケーション プールに関心があるか、.NET の ThreadPool を使用したくない場合があります。

この状況

IScheduler 自体の実装に問題がある場合は、お知らせください。

幸運を

于 2013-09-08T08:22:30.587 に答える