【问题标题】:Delayed execution of background worker's DoWork event后台worker的DoWork事件延迟执行
【发布时间】:2014-01-29 14:10:48
【问题描述】:

我正在解决我的 PowerShell 4.0 脚本中的问题。我使用 windows Forms 命名空间构建了一个用户界面,但需要进行一些耗时的处理,这就是我采用BackgroundWorker 以保持我的 GUI 响应的原因。

一旦开始,我就使用$Worker.Add_DoWork({}) 方法添加事件订阅,但这不起作用。这就是我改用Register-ObjectEvent 的原因。现在我的DoWork 事件只有在我关闭表单后才会执行,我不明白为什么会这样。我的代码在下面,有人可以帮我解决这个问题吗?

#Create worker object
$Worker = new-object System.ComponentModel.BackgroundWorker;
$Worker.WorkerReportsProgress = $true;

#Handles $Worker.ReportProgress event
$ReportProgress = {$Progressbar.PerformStep()}; 

#Handles $Worker.DoWork event
$DoWork = { write-host("do work event fired")};

#Add eventhandlers
Register-ObjectEvent -InputObject $Worker -EventName DoWork -Action $DoWork ;
Register-ObjectEvent -InputObject $Worker -EventName ProgressChanged -Action $ReportProgress; 

如果我在脚本中调用$Worker.RunWorkerAsync() 方法,则不会生成任何输出。如果我关闭调用$Worker.RunWorkerAsync() 方法的表单,则文本“Do work event 已触发”将输出到 PowerShell 控制台。

【问题讨论】:

    标签: powershell backgroundworker powershell-4.0


    【解决方案1】:

    为了回答我自己的问题,这里是更新进度条的文件复制示例。 Copy-File 方法取自 stej 在线程 Progress during large file copy (Copy-Item & Write-Progress?) 中给出的示例,我根据自己的需要对其进行了修改。只需在主脚本中监听来自后台作业的事件。

    #Register event
    Register-EngineEvent -SourceIdentifier Progress -Action {
                            $Progressbar.Value = $event.MessageData; 
                            $StatusText.Text = "Copying VHD File - " + $event.MessageData + " % complete"; 
                            $Form.Refresh();} >null
    
    #Create worker and perform the work
    $worker = start-job -name "Work" -scriptblock {    
    Register-EngineEvent -SourceIdentifier Progress -Forward;
    
    function Copy-File 
    {
        param( [string]$from, [string]$to)
        $ffile = [io.file]::OpenRead($from)
        $tofile = [io.file]::OpenWrite($to)
    
        try {
    
            [byte[]]$buff = new-object byte[] 4096 #(4096*1024)
            [long]$total = [long]$count = 0
            do {
                $count = $ffile.Read($buff, 0, $buff.Length)
                $tofile.Write($buff, 0, $count)
                $total += $count
                [int]$pctcomp = ([int]($total/$ffile.Length* 100));
                if ($total % 1mb -eq 0) {
                       New-Event -SourceIdentifier Progress -MessageData  $pctcomp;
                }
            } while ($count -gt 0)
    
        }
    
        finally {
             $ffile.Close();
             $tofile.Close();
            }
    }
    
    Copy-File -from ("F:\HIS0402_C.wim") -to ("X:\JT\HIS0164.vhd");
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      • 2019-06-22
      • 2023-03-05
      相关资源
      最近更新 更多