Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TPL数据流TransformBlock执行顺序似乎有误/异步_C#_Async Await_Task Parallel Library_Tpl Dataflow - Fatal编程技术网

C# TPL数据流TransformBlock执行顺序似乎有误/异步

C# TPL数据流TransformBlock执行顺序似乎有误/异步,c#,async-await,task-parallel-library,tpl-dataflow,C#,Async Await,Task Parallel Library,Tpl Dataflow,我正沿着这个走。我创建了一个TransformBlock,并通过对其执行Post来执行它 // Process "The Adventurous Life of a Versatile Artist: Houdini" // by Harry Houdini. downloadString.Post("http://www.gutenberg.org/cache/epub/45370/pg45370.txt"); 然后,我调用Complete方法,并有一个Cons

我正沿着这个走。我创建了一个
TransformBlock
,并通过对其执行
Post
来执行它

  // Process "The Adventurous Life of a Versatile Artist: Houdini" 
  //         by Harry Houdini.
  downloadString.Post("http://www.gutenberg.org/cache/epub/45370/pg45370.txt");
然后,我调用
Complete
方法,并有一个
Console.WriteLine(“按键退出:”)

这是完整的代码。您也可以在此阶段在中找到它

但这是实际输出。(我已经用相同的
Console.WriteLine
输出序列运行了几次

实际产量 为什么在调用
TransformBlock
控制台之前,
按键退出

既然我首先调用了
TransformBlock
控制台.WriteLine,而且这将是管道的一部分,那么就我所知,我没有任何
async
代码,而且我也不完全了解TPL数据流的内部工作原理,那么为什么会出现这种情况呢执行有问题吗

谢谢大家!

为什么在调用TransformBlock的Console.WriteLines之前要执行按键退出行

调用
Console.WriteLine(“按键退出:”)
发生在
TransformBlock
完成转换功能之前。发布到
TransformBlock
的每个项目将根据主上下文异步处理

如果您希望等待管道完成,则需要阻止其
完成任务
等待
异步
方法完成:

private static async Task MainAsync() {
    // Process "The Adventurous Life of a Versatile Artist: Houdini" 
    //         by Harry Houdini.
    downloadString.Post("http://www.gutenberg.org/cache/epub/45370/pg45370.txt");
    downloadString.Complete();

    await downloadString.Completion;
}

Post
方法将在已发布的项目存储在块的输入队列中后返回,它不会等待对其进行处理

从:

一旦目标块决定接受或拒绝该项,此方法将返回,但除非目标块的特殊语义另有规定,否则它不会等待该项实际被处理。例如,ActionBlock将发布的项存储到其输入队列中后立即从Post返回


然后异步处理输入队列中的项目。

谢谢。因此,当各个块在管道中链接在一起时,如So=>
//连接数据流块以形成管道。//downloadString.LinkTo(createWordList);链接到(filterWordList);filterWordList.LinkTo(findReversedWords);findReversedWords.LinkTo(打印反向单词)演练代码的哪一部分确保将上一个块的输出作为输入提供给下一个块?例如:
downloadString
的输出作为输入发送到
createWordList
(但只有在
downloadString
完成后,对不对?@Shiva ex:downloadString的输出作为输入发送到createWordList)(但只有在下载字符串完成后,对吗?
LinkTo
将确保从一个块的输出传递到链接块的输入。此外,您还可以在
LinkTo
中添加
DataflowLinkOptions
,以便在调用时将
传播完成
设置为
true
。)在第一个块上完成,完成将通过您的管道传播,您将等待管道中最后一个块的完成。
Downloading from http://www.gutenberg.org/cache/epub/45370/pg45370.txt...
Downloaded 129393 characters...
Press a key to exit:
Press a key to exit:
Downloading from http://www.gutenberg.org/cache/epub/45370/pg45370.txt...
Downloaded 129393 characters...
private static async Task MainAsync() {
    // Process "The Adventurous Life of a Versatile Artist: Houdini" 
    //         by Harry Houdini.
    downloadString.Post("http://www.gutenberg.org/cache/epub/45370/pg45370.txt");
    downloadString.Complete();

    await downloadString.Completion;
}