6

BufferBlock と ActionBlock を使用してプロデューサー/コンシューマー データフロー ブロックをセットアップしましたが、コンソール アプリケーション内で正常に動作しています。

すべてのアイテムを BurfferBlock に追加し、BufferBlock を他のアクション アイテムとリンクした後。それはうまくいっています。

ここで、このデータフロー ブロック パイプラインが常に稼働している内部サービスを使用したいと考えています。また、外部イベントを介してメッセージが利用可能になると、メッセージは bufferblock 内に入り、処理が開始されます。どうすればこれを達成できますか?

これまでのところ、私は以下を行っています:

public void SetupPipeline()
{
    FirstBlock = new ActionBlock<WorkItem>(new Action<WorkItem>(ProcessIncomingMessage),
    new ExecutionDataflowBlockOptions
    {
        MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded
    });

    BufferBlock = new BufferBlock<WorkItem>();

    GroupingDataflowBlockOptions GroupingDataflowBlockOptions = new GroupingDataflowBlockOptions();
    GroupingDataflowBlockOptions.Greedy = true;
    GroupingDataflowBlockOptions.BoundedCapacity = GroupingDataflowBlockOptions.Unbounded;
    CancellationTokenSource = new CancellationTokenSource();
    CancellationToken = CancellationTokenSource.Token;
    GroupingDataflowBlockOptions.CancellationToken = CancellationToken;
    BatchBlock = new BatchBlock<WorkItem>(BoundingCapacity, GroupingDataflowBlockOptions);

    ProcessItems = new ActionBlock<WorkItem[]>(WorkItems =>
        ProcessWorkItems(WorkItems.ToList<WorkItem>()),
        new ExecutionDataflowBlockOptions
      {
          CancellationToken = CancellationToken
      });

    Timer = new Timer(_ =>
            BatchBlock.TriggerBatch()
        );

    TimingBlock = new TransformBlock<WorkItem, WorkItem>(WorkItem =>
    {
        Timer.Change(TimerInterval, Timeout.Infinite);
        logger.Debug("Inside TimingBlock : " + WorkItem.ToString());
        return WorkItem;
    }, new ExecutionDataflowBlockOptions
    {
        CancellationToken = CancellationToken
    });

    BatchBlock.LinkTo(ProcessItems);
    TimingBlock.LinkTo(BatchBlock);
    BufferBlock.LinkTo(TimingBlock);
}
4

2 に答える 2

2

極端に単純化して言えば、DataFlow は一連のメソッドを使用して一連のオブジェクトを処理する方法です。これらのオブジェクトを作成する特定の方法を提供したり期待したりすることはありません。

パイプラインを存続させたい場合は、アプリケーションを終了しないでください。コンソール アプリケーションを使用したくない場合は、パイプラインを構築し、閉じるまでオブジェクトを送信するサービスを作成します。

メッセージは、データを読み取ったり、イベントに応答したり (その意味が何であれ)、またはその他の方法で作成する単なるオブジェクトです。

外部イベントとはどういう意味ですか?誰かがアプリケーションにデータを送信することはありますか? これには多くの方法があります。

  • データが別のコンソール アプリケーションからのものである場合、あるアプリケーションの結果を別のアプリケーションにパイプし、コマンドライン アプリケーションの入力ストリームからのデータを解析し、メッセージを作成してパイプラインに渡すことができます。
  • 要求をリッスンするサービスが必要な場合は、.NET パイプ、WCF、または Web API サービスをホストして呼び出しをリッスンし、ポストされたデータをパイプラインに渡すことができます。
  • データがデータベースから取得された場合、変更をポーリングして、変更されたデータをパイプラインに送信できる場合があります。

重要なのは、Dataflow はデータを処理することであり、イベントをリッスンすることではありません。それがあなたが探していたものであるなら、それは本格的な分散エージェントシステムではありません。

于 2013-12-03T10:58:47.420 に答える