Связанный блок не завершается

Я начинаю с TPL DataFlow. Я создал следующий рабочий код. readFilesBlock — это BufferBlock. Он заполняется следующим образом:

public async void ReadItems(ITargetBlock<SourceCodeFile> target)
{
    foreach(var item in Source)
    {
        await target.SendAsync(item); //when To use post instead of sendasync? 
    }
}

target.Complete(); 

Теперь я использую BufferBlock (readFilesBlock) следующим образом.

while (await readFilesBlock.OutputAvailableAsync())
    {
        var file = await readFilesBlock.ReceiveAsync();

        ActionBlock<SourceCodeFile> action = new ActionBlock<SourceCodeFile>(item => storeResultsInBag(resultBag, item));
        await action.SendAsync(file);
    }

Это работает нормально. Теперь я хочу использовать ссылку

Я попытался:

var storeFilesInBagAction = new ActionBlock<SourceCodeFile>(item => storeResultsInBag(resultBag, item));

readFilesBlock.LinkTo(storeFilesInBagAction);

await storeFilesInBagAction.Completion;

Но на этот раз я никогда не получу завершение.

Что я делаю не так?

Когда я не жду файлы магазина в Bagaction, предметы не возвращаются.


person Boas Enkler    schedule 11.12.2013    source источник
comment
1. Избегайте async void. 2. Вам не нужно создавать новый ActionBlock для каждого файла.   -  person svick    schedule 12.12.2013


Ответы (1)


По умолчанию блоки потока данных не распространяют завершение. Это по дизайну; потоки данных могут представлять любой вид сетки, включая разбиения, соединения и циклы (не только конвейеры).

Существует PropagateCompletion вариант вы можете установить при связывании, что будет распространяться завершение.

readFilesBlock.LinkTo(storeFilesInBagAction, new DataflowLinkOptions
{
    PropagateCompletion = true,
});
person Stephen Cleary    schedule 11.12.2013
comment
Спасибо, это было. Кстати, можете ли вы дать мне какой-нибудь намек на хорошие веб-трансляции / учебники по этой теме? - person Boas Enkler; 11.12.2013
comment
Я не знаю ни одного отличного учебника. Я сделал вступление из трех частей в своем блоге, но оно не идеально. Более подробное руководство — это оригинальное введение в поток данных TPL< /а> документ. - person Stephen Cleary; 11.12.2013