Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.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# 将SFTP文件夹用作并发工作队列的最佳方法_C#_Message Queue_Sftp - Fatal编程技术网

C# 将SFTP文件夹用作并发工作队列的最佳方法

C# 将SFTP文件夹用作并发工作队列的最佳方法,c#,message-queue,sftp,C#,Message Queue,Sftp,我正在编写一个c#windows服务,它将轮询SFTP文件夹中的新文件(一个文件=一个作业)并对其进行处理。服务的多个实例可能同时运行,因此它们之间不要相互踩在一起,这一点很重要 我意识到SFTP文件夹并不能构成理想的队列,但这正是我必须处理的问题。要将此SFTP文件夹用作并发消息队列,或者以可并发使用的方式安全地表示它,我需要做什么 可能会出现多个服务实例 同时在运行 在同一台机器上,还是在不同的机器上?不确定在Windows中移动文件是否是原子操作。 如果是,那么当服务选择处理文件时,它应该

我正在编写一个c#windows服务,它将轮询SFTP文件夹中的新文件(一个文件=一个作业)并对其进行处理。服务的多个实例可能同时运行,因此它们之间不要相互踩在一起,这一点很重要

我意识到SFTP文件夹并不能构成理想的队列,但这正是我必须处理的问题。要将此SFTP文件夹用作并发消息队列,或者以可并发使用的方式安全地表示它,我需要做什么

可能会出现多个服务实例 同时在运行


在同一台机器上,还是在不同的机器上?

不确定在Windows中移动文件是否是原子操作。 如果是,那么当服务选择处理文件时,它应该尝试将文件移动到另一个文件夹。
如果移动操作成功,则可以安全地处理该文件。

似乎最大的问题是处理程序的多个实例相互重叠并处理相同的文件


我过去处理这个问题的方法是让程序获取第一个文件,并立即将其从“filename.txt”重命名为“filename.txt.processing”。这些进程将被设置为忽略以“.processing”结尾的任何文件,这样它们就不会相互干扰。我不认为文件重命名是完全原子化的,但我从来没有遇到过任何问题。

您还可以利用数据库跟踪哪些文件正在处理、已处理或正在等待处理

这增加了用新文件更新表的复杂性