Обрабатывать события в другом классе - PullRequest
4 голосов
/ 02 сентября 2011

Я пытаюсь переместить некоторый код в некоторые файлы классов, чтобы очистить мой код. Одна из проблем, с которыми я сталкиваюсь, - это отчет о ходе событий между объектом, выполняющим задачу, и индикатором выполнения.

Я полагаю, функции событий должны быть помещены в новый класс, но им также необходимо обновить индикатор выполнения в вызывающей форме? Может ли класс \ объект возвращать обновления вместо обработчиков событий?

На данный момент форма имеет весь код:

Function DoRestore(ByVal SQLServer As String, ByVal BackupFilePath As String, ByVal DatabaseName As String)
    Dim Server As Server = New Server(SQLServer)
    Server.ConnectionContext.ApplicationName = Application.ProductName
    Dim res As Restore = New Restore()
    Dim dt As DataTable

        res.Devices.AddDevice(BackupFilePath, DeviceType.File)
        dt = res.ReadFileList(Server)
        res.Database = DatabaseName
        res.PercentCompleteNotification = 1
        AddHandler res.PercentComplete, AddressOf RestoreProgressEventHandler
        AddHandler res.Complete, AddressOf RestoreCompleteEventHandler

        res.SqlRestoreAsync(Server)
        While res.AsyncStatus.ExecutionStatus = ExecutionStatus.InProgress
            Application.DoEvents()
        End While

End Function



Private Function RestoreProgressEventHandler(ByVal sender As Object, ByVal e As PercentCompleteEventArgs)
 'Update progress bar (e.Percent)
End Function



Private Sub RestoreCompleteEventHandler(ByVal sender As Object, ByVal e As Microsoft.SqlServer.Management.Common.ServerMessageEventArgs)
'Signal completion
End Sub

Используется через:

DoRestore(SQLServer, "C:\SQLBACKUP.bak", DatabaseName)

Ответы [ 2 ]

10 голосов
/ 02 сентября 2011

Вы должны определить событие в вашем классе и обработать обновление индикатора выполнения в форме (предполагая WinForms?) - суть в том, что класс заинтересован в резервном копировании чего-либо - у него не должно быть никакого понятия о прогрессе бары:

Определите событие в классе:

Public Event ReportProgress(byval progress as integer)

При необходимости выполнить резервное копирование этого события:

RaiseEvent ReportProgress(value)

В коде вызова вам либо нужно

  • Определить класс, используя WithEvents:

    Private WithEvents Backup As BackupClass
    

    и затем действовать на событие:

    Private Sub Backup _ReportProgress(progress As Integer) Handles Backup.ReportProgress
        Debug.WriteLine("Progress:" + progress.ToString)
    End Sub
    
  • Или добавить обработчик вручную:

    Private Sub Backup_ReportProgressHandler(progress As Integer)
        Debug.WriteLine("Progress Handler:" + progress.ToString)
    End Sub
    
    AddHandler Backup.ReportProgress, AddressOf Backup_ReportProgressHandler
    
2 голосов
/ 02 сентября 2011

Ну, вы можете сделать это, но, если честно, я нахожу это менее запутанным, если такие вещи, как обработчики событий, которые обновляют индикатор выполнения для формы, находятся в этой форме. В противном случае, чтобы сохранить его позже (например, чтобы исправить проблему с индикатором выполнения), мне нужно отправиться в экспедицию, чтобы выяснить, где вы его спрятали.

Так что, IMO, если форма вызывает класс, который что-то делает, и этот класс возвращает уведомления о ходе выполнения, будет хорошей идеей обработать эти уведомления в вызывающей форме.

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