5

我们有一个运行以下代码的活动:

$nr = $WorkflowData['_Number']

## Write to text
$nr>>C:\Configuration\nrFile.txt

基本上,它会获得一个唯一的编号,应该将其添加到文件中。问题是这个活动在多个可以同时运行的工作流中运行。这导致了很多错误,说它nrFile.txt是由同时运行的另一个作业打开的。

有没有办法同时从多个工作流写入同一个文件?

或者也许以某种方式将它们排队?

4

2 回答 2

11

您可以使用互斥锁同步文件访问,例如

$mutex = new-object System.Threading.Mutex $false,'SomeUniqueName'
...
nr = $WorkflowData['_Number']
$mutex.WaitOne() > $null
$nr >> C:\Configuration\nrFile.txt
$mutex.ReleaseMutex()
于 2013-08-06T16:35:33.147 回答
2

您交替表示多个作业正在尝试访问文件,或工作流中的多个活动。作业被隔离到单独的进程中,因此某些防止争用的机制不适用。工作流程在同一流程中运行,因此这些方法在这种情况下可能是合适的。

这并不迷人,但基本的“如果一开始你没有成功,请尝试,再试一次”的方法通常完全适合这样的事情。

filter append
{
   param(
       [Parameter(Mandatory = $true, ValueFromPipeline = $true)][string[]] $line,
       [Parameter(Mandatory = $true, Position = 0)][string] $path
   )

   $done = $false
   while(-not $done)
   {
       try{ $line | out-file $path -append -ea Stop }
       catch { sleep 1; continue }
       $done = $true
   }
}

$nr | append C:\Configuration\nrFile.txt

编辑 以前错误地断言命名互斥锁(基思的方法)在进程间不起作用。

于 2013-08-06T17:31:35.973 回答