Číst v angličtině

Sdílet prostřednictvím


Postupy: Zrušení propojení bloků toku dat

Tento dokument popisuje, jak zrušit propojení bloku cílového toku dat od zdroje.

Poznámka

Knihovna toku dat TPL ( System.Threading.Tasks.Dataflow obor názvů) není distribuována s .NET. Pokud chcete nainstalovat System.Threading.Tasks.Dataflow obor názvů v sadě Visual Studio, otevřete projekt, v nabídce Projekt zvolte Spravovat balíčky NuGet a vyhledejte System.Threading.Tasks.Dataflow balíček online. Pokud ho chcete nainstalovat pomocí rozhraní příkazového řádku .NET Core, spusťte dotnet add package System.Threading.Tasks.Dataflow.

Příklad

Následující příklad vytvoří tři TransformBlock<TInput,TOutput> objekty, z nichž každá volá metodu TrySolution pro výpočet hodnoty. Tento příklad vyžaduje k dokončení pouze výsledek prvního volání TrySolution .

using System;
using System.Threading;
using System.Threading.Tasks.Dataflow;

// Demonstrates how to unlink dataflow blocks.
class DataflowReceiveAny
{
   // Receives the value from the first provided source that has
   // a message.
   public static T ReceiveFromAny<T>(params ISourceBlock<T>[] sources)
   {
      // Create a WriteOnceBlock<T> object and link it to each source block.
      var writeOnceBlock = new WriteOnceBlock<T>(e => e);
      foreach (var source in sources)
      {
         // Setting MaxMessages to one instructs
         // the source block to unlink from the WriteOnceBlock<T> object
         // after offering the WriteOnceBlock<T> object one message.
         source.LinkTo(writeOnceBlock, new DataflowLinkOptions { MaxMessages = 1 });
      }
      // Return the first value that is offered to the WriteOnceBlock object.
      return writeOnceBlock.Receive();
   }

   // Demonstrates a function that takes several seconds to produce a result.
   static int TrySolution(int n, CancellationToken ct)
   {
      // Simulate a lengthy operation that completes within three seconds
      // or when the provided CancellationToken object is cancelled.
      SpinWait.SpinUntil(() => ct.IsCancellationRequested,
         new Random().Next(3000));

      // Return a value.
      return n + 42;
   }

   static void Main(string[] args)
   {
      // Create a shared CancellationTokenSource object to enable the
      // TrySolution method to be cancelled.
      var cts = new CancellationTokenSource();

      // Create three TransformBlock<int, int> objects.
      // Each TransformBlock<int, int> object calls the TrySolution method.
      Func<int, int> action = n => TrySolution(n, cts.Token);
      var trySolution1 = new TransformBlock<int, int>(action);
      var trySolution2 = new TransformBlock<int, int>(action);
      var trySolution3 = new TransformBlock<int, int>(action);

      // Post data to each TransformBlock<int, int> object.
      trySolution1.Post(11);
      trySolution2.Post(21);
      trySolution3.Post(31);

      // Call the ReceiveFromAny<T> method to receive the result from the
      // first TransformBlock<int, int> object to finish.
      int result = ReceiveFromAny(trySolution1, trySolution2, trySolution3);

      // Cancel all calls to TrySolution that are still active.
      cts.Cancel();

      // Print the result to the console.
      Console.WriteLine("The solution is {0}.", result);

      cts.Dispose();
   }
}

/* Sample output:
The solution is 53.
*/

Chcete-li získat hodnotu z prvního TransformBlock<TInput,TOutput> objektu, který se dokončí, tento příklad definuje metodu ReceiveFromAny(T) . Metoda ReceiveFromAny(T) přijímá pole ISourceBlock<TOutput> objektů a každý z těchto objektů propojuje s objektem WriteOnceBlock<T> . Když použijete metodu LinkTo pro propojení bloku zdrojového toku dat s cílovým blokem, zdroj rozšíří zprávy do cíle, jakmile budou data k dispozici. WriteOnceBlock<T> Protože třída přijímá pouze první zprávu, kterou je nabízena, ReceiveFromAny(T) metoda vytvoří svůj výsledek voláním Receive metody. Tím se vytvoří první zpráva, která je nabízena objektu WriteOnceBlock<T> . Metoda LinkTo má přetíženou verzi, která přebírá DataflowLinkOptions objekt s MaxMessages vlastností, která, když je nastavena na 1, dává zdrojovému bloku pokyn zrušit propojení z cíle poté, co cíl obdrží jednu zprávu ze zdroje. Je důležité, WriteOnceBlock<T> aby objekt odpojil od svých zdrojů, protože vztah mezi polem zdrojů a WriteOnceBlock<T> objektem už není vyžadován po WriteOnceBlock<T> přijetí zprávy objektu.

Chcete-li povolit zbývající volání na TrySolution konec po jednom z nich vypočítá hodnotu, TrySolution metoda vezme CancellationToken objekt, který je zrušen po volání vrátit ReceiveFromAny(T) . Metoda SpinUntil vrátí při zrušení tohoto CancellationToken objektu.

Viz také