Для чего нужен этот конструктор: ActionBlock‹TInput› Constructor (Func‹TInput, Task›)

Ранее я использовал ActionBlock через другой конструктор:

ActionBlock<TInput> Constructor (Action<TInput>)

Но для того, что в заголовке, с возвращаемым типом Task, я не уверен, что ActionBlock делает с возвращенным Task. Я предполагаю, что это как-то для ожидания асинхронного делегата, предоставленного в конструктор? Могу ли я получить его?


person Elliot    schedule 16.01.2013    source источник
comment
Вы документацию на него смотрели?   -  person Bobson    schedule 17.01.2013
comment
Да, это очень редко, но теперь я нашел ответ (сейчас отвечу на свой вопрос).   -  person Elliot    schedule 17.01.2013


Ответы (1)


Хорошо, я должен был догадаться, что это для предоставления асинхронного делегата. Я, должно быть, был немного незнаком с синтаксисом для этого. Вот пример одного такого делегата:

var writer = new ActionBlock<string>(async url =>
{
    WebClient wc = new WebClient();
    // using IOCP the thread pool worker thread does return to the pool
    byte[] buffer = await wc.DownloadDataTaskAsync(url);
    string fileName = Path.GetFileName(url);

    string name = @"Images\" + fileName;

    using (Stream srm = File.OpenWrite(name))
    {
        await srm.WriteAsync(buffer, 0, buffer.Length);
    }
});

Таким образом, можно сказать, что делегат async url => имеет тип Func<String, Task>.

Пример взят из: http://blogs.microsoft.co.il/blogs/bnaya/archive/2012/01/28/tpl-dataflow-walkthrough-part-5.aspx

person Elliot    schedule 16.01.2013
comment
Да, это, наверное, самое распространенное использование. Но подойдет любой делегат, возвращающий Task, и блок будет асинхронно ждать его завершения. - person svick; 17.01.2013