Powershell winform, как запускать и управлять заданиями в фоновом режиме - PullRequest
0 голосов
/ 17 июня 2019

Я создал графический интерфейс winforms для моего скрипта PS.
При нажатии на кнопку «Пуск» скрипт извлекает данные из списка адресов, изменяет основной текст и объект и отправляет электронное письмо с индикатором выполнения.

# FORM BUTTON START
function ButtonStart_Click {

    $script:CancelLoop = $false

    $ProgressBar1.Visible = $true
    $progressbar1.Value = 0
    $LabelCounter.visible = $true

    $ButtonStart.Enabled = $false
    $ButtonStop.Enabled = $true
    $TextBoxSubject.ReadOnly = $true
    $TextBoxTimeout.ReadOnly = $true

    # =============================================================
    # LOOP DATA OBJECT
    # =============================================================
    $Counter = 0
    $ErrorCounter = 0
    $Timeout = 0

    foreach ($Row in $ExcelData) {

        [System.Windows.Forms.Application]::DoEvents()

        # =============================================================
        # Customize mail subject
        # =============================================================
        $Id = Get-Random -Minimum 99999999
        $Subject = ReplaceChars $TextBoxSubject.Text $Id
        $MailSettings.Subject = $Subject

        # Check timeout input
        if ($TextBoxTimeout.Text -match '^[0-9]+$'){
            $Timeout = [int]$TextBoxTimeout.Text
        }

        # =============================================================
        # Customize body
        # =============================================================
        $BodyHTML = ReplaceChars $Body $Row

        # =============================================================
        # PROGRESSBAR
        # =============================================================        
        if ($script:CancelLoop -eq $true){
            $progressbar1.Value = 0
            break
        }

        # Calculate The Percentage Completed 
        $Counter++ 
        [Int]$Percentage = ($Counter/$ExcelData.Count)*100 
        $ProgressBar1.Value = $Percentage 
        $LabelCounter.Text = "Invio $Counter di " +$ExcelData.Count 

        # =============================================================
        # SEND EMAIL
        # =============================================================     
        if ($Row.Email) {

            try {
                Send-MailMessage -to $Row.Email -Body $BodyHTML -BodyAsHtml @MailSettings -ErrorAction STOP

                if ($Timeout -gt 0) {
                    Sleep $Timeout
                }
             }
            catch {
                Log-Write $ErrorLogFile $_.Exception.Message
                $ErrorCounter++;
            }

        }

    }

    if ($Counter -eq $ExcelData.Count) {
        [System.Windows.Forms.MessageBox]::Show("OK!","Info","OK","Information")
        $ButtonStop.Enabled = $false

        # Show Errors Popup
        if ($ErrorCounter -gt 0) {
            [System.Windows.Forms.MessageBox]::Show("Error !","Error","OK","Error")
        }
        $Form.close()
    }


# FORM BUTTON STOP
function ButtonStop_Click {
    $script:CancelLoop = $true
    $ProgressBar1.Visible = $false 
    $ProgressBar1.Value = 0
    $LabelCounter.Visible = $false
    $TextBoxSubject.ReadOnly = $false
    $TextBoxSubject.Text = ""
    $TextBoxTimeout.ReadOnly = $false
}

Моя проблема в том, что во время выполнения скрипта кажется, что графический интерфейс зависает.
Даже кнопка остановки иногда, несмотря на то, что она включена, кажется, не взаимодействует. Я хотел бы попытаться запустить цикл для генерации и отправки почты в фоновом режиме (решить замораживание?), Сохранив индикатор выполнения и командную кнопку в основных окнах, но, к сожалению, я не смог этого сделать (я потерял контроль над фоновой работой). Можете ли вы дать мне руку, чтобы сделать это?
Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...