Effizient umgehen mehrere asynchrone WCF -Aufrufe mit TPL -Datenflow
Bei der Behandlung mehrerer asynchroner WCF -Anrufe in C#ist Parallel.ForEach
nicht ideal, da es nicht direkt await
unterstützt. Eine robustere Lösung besteht darin, den Datenfluss der Aufgabe parallel Bibliothek (TPL DataFlow) zu nutzen, der sich bei der Verwaltung asynchroner Vorgänge auszeichnet.
Dieses Beispiel zeigt, wie der Code mit TPL DataFlow für gleichzeitige asynchrone WCF -Aufrufe umgeschrieben wird:
// Create a TransformBlock to asynchronously fetch Customer data. var getCustomerBlock = new TransformBlock<string, Customer>( async id => { ICustomerRepo repo = new CustomerRepo(); return await repo.GetCustomer(id); }, new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = DataflowBlockOptions.Unbounded // Adjust as needed }); // Create an ActionBlock to process each retrieved Customer. var writeCustomerBlock = new ActionBlock<Customer>(c => Console.WriteLine(c.ID)); // Link the blocks; PropagateCompletion ensures the pipeline finishes. getCustomerBlock.LinkTo(writeCustomerBlock, new DataflowLinkOptions { PropagateCompletion = true }); // Post IDs to the TransformBlock. foreach (var id in ids) { getCustomerBlock.Post(id); } // Signal completion and wait for all processing to finish. getCustomerBlock.Complete(); writeCustomerBlock.Completion.Wait();
Schlüsselverbesserungen:
await
TransformBlock
kontrollierte Parallelität: MaxDegreeOfParallelism
DataflowBlockOptions.Unbounded
Verbesserte Struktur: basierend auf den Ressourcen Ihres Systems und der Größe Ihrer Parallel.ForEach
-Kollektion anzupassen. await
Das obige ist der detaillierte Inhalt vonWie kann ich mehrere asynchrone WCF -Anrufe gleichzeitig in C#durchführen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!