TPL数据流 - 如何在继续下一步之前确保完成一个工作块?

时间:2018-02-03 12:55:27

标签: c# .net task-parallel-library producer-consumer tpl-dataflow

我对TPL Dataflow仍然相对较新,并且不能100%确定我是否正确使用它,或者我是否甚至想要使用它。

我尝试使用此库来帮助进行文件复制+文件上传。

基本上,我们的应用程序中处理文件的结构/过程如下:

1)最终用户将从磁盘中选择一堆文件,然后选择将它们导入我们的系统。

2)某些文件具有更高的优先级,而其他文件可以按照自己的进度完成。

3)这里导入一堆文件的过程是:

  • 将这些导入请求排队,一个请求映射到一个文件
  • 这些请求存储在本地sqlite db
  • 这些请求还明确指出它是否需要更高的优先级
  • 我们目前有两个活动线程正在运行(一个用于管理更高优先级,另一个用于更低优先级)
  • 他们进入等待状态直到发出信号。
  • 当新请求进入时,他们会收到信号,以便深入了解本地数据库以处理请求。
  • 两个线程都负责将文件复制到单独的缓存位置,因此只需要一个简单的File.Copy调用。不同的是,一个线程立即执行实际的File.Copy调用。另一个线程只是将它们全部排入ThreadPool运行。 - 复制文件后,请求会更新,请求具有状态枚举属性,该属性具有不同的状态,如复制,复制等。
  • 请求还需要设置ServerTimestamp,ServerTimestamp很重要,因为有时候用户可能会保存对文件的更改,这些更改基本相同,但版本不同,所以订单是重要的。
  • 正在运行另一个单独的线程,该线程被发出信号以从状态为Copied的本地DB获取请求。然后它将ping一个端点以请求ServerTimestamp,并用它来更新请求
  • 最后,一旦请求完成文件复制并设置了服务器票证,我们现在可以将物理文件上传到服务器。

因此,我正在使用TransformBlock'

1-文件复制TransformBLock

  • 我认为可能有两个文件复制TransformBlock,其中一个用于较高优先级,另一个用于较低优先级。

我的理解是它使用在后台使用ThreadPool的TaskScheduler.Current。我想也许是一个自定义的TaskScheduler,可以动态生成一个新线程。此调度程序可用于更高优先级的文件复制块。

2- ServerTimestamp TransformBlock

  • 所以这个将链接到第一个块,并接收所有复制的文件并获取服务器时间戳并在请求中设置它。

3-UploadFIle TransformBlock

  • 这将上传文件

我面临的问题:

比如说我们在本地数据库中排队了5个文件请求。

File1中 文件2 文件3-V1 文件3-V2 file3的-V3

我们将所有5个请求发布/发送到第一个块。

如果File1,File2,File3-v1,File3-v3成功但File3-v2失败,我希望该块不会流到下一个ServerTimestamp块,因为它非常重要File3版本是完全的在继续之前复制,否则它将失灵。

但是这会导致如何正确地重试并将已经复制的其他4个文件移动到下一个块?

我不确定我是否正确构造这个或者TPL Dataflow是否支持我的用例。

0 个答案:

没有答案