Использование Akka.NET FileIO.FromFile в потоке - PullRequest
0 голосов
/ 15 мая 2018

Я хочу встроить FileIO.FromFile в график, чтобы можно было использовать вывод ByteString этого источника.

В каждой попытке ниже я использую одну и ту же раковину:

Sink<ByteString, Task<IImmutableList<ByteString>>> sink = Sink
   .Seq<ByteString>()
   .Named("sink");

Чтобы проиллюстрировать свои трудности, я покажу серию попыток с полными типами:

Сначала - используя FileIO.FromFile в качестве источника:

Source<ByteString, Task<IOResult>> source = FileIO
   .FromFile(new FileInfo(fileName))
   .Named("source");

IRunnableGraph<Task<IOResult>> runnableGraph = source.To(sink);
IOResult result = runnableGraph.Run(Context.Materializer()).Result;
Log.Info(result.Count.ToString());

Это компилируется.

Теперь я хочу использовать источник string и создать из него ByteString, используя FileIO.FromFile:

Source<Source<ByteString, Task<IOResult>>, NotUsed> source = Source
   .Single(fileName)
   .Select(x => FileIO.FromFile(new FileInfo(x)))
   .Named("source");

??? runnableGraph = source.To(sink);
??? result = runnableGraph.Run(Context.Materializer()).Result;
Log.Info(result.Count.ToString());

Это не компилируется, так как тип источника является источником (Source<Source<ByteString, Task<IOResult>>, NotUsed>), который не может быть подан в приемник.

Итак, я попытался использовать поток для передачи string в FileIO.FromFile:

Source<string, NotUsed> source = Source
   .Single(fileName)
   .Named("source");

Flow<string, Source<ByteString, Task<IOResult>>, NotUsed> flow = Flow
   .FromFunction<string, Source<ByteString, Task<IOResult>>>(x => FileIO.FromFile(new FileInfo(x)));

??? runnableGraph = source.Via(flow).To(sink);
??? result        = runnableGraph.Run(Context.Materializer()).Result;
Log.Info(result.Count.ToString());

Это тоже не удается скомпилировать (хотя оно становится ближе.) Тип вывода flow равен Source<ByteString, Task<IOResult>>, соответствует типу источника с первой попытки, но все еще не может быть передан в приемник!

Почему источник типа Source<ByteString, Task<IOResult>> в первом примере может быть передан в приемник, но вывод потока в последнем примере не будет?

...