2011-09-02 149 views
4

我試圖將一些代碼移入某些類文件以清理我的代碼。我遇到的一個問題是報告執行任務的對象與進度條之間的事件進度。在另一個類中處理事件

我想事件函數必須放在新類中,但他們也需要更新調用窗體上的進度條? class \ object可以返回更新來代替事件處理程序嗎?

目前的形式具有所有代碼:

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) 
+0

你會用這段代碼讓自己陷入相當深的麻煩。檢查這個答案:http://stackoverflow.com/questions/5181777/c-application-doevents/5183623#5183623 –

回答

10

你應該在你的類中定義一個事件並處理表單中的進度條更新(假設爲WinForms?) - 這裏的重點是該類是關於備份的東西 - 它不應該有任何概念進度條:做備份時

Public Event ReportProgress(byval progress as integer) 

引發此事件的要求:

RaiseEvent ReportProgress(value) 

在T

定義在類的事件他調用代碼,你要麼需要

  • 使用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 
    
+0

你可以通過讓另一個子類將自定義事件提升到你的控制器類來級聯。控制器中的事件處理程序然後調用backgroundworker上的ReportProgress來更新前端線程中的GUI。 – Andreas

2

那麼你可以這樣做,但說實話我覺得少混亂,如果事情像事件處理程序更新窗體的進度條就是這種形式。否則,爲了在稍後維護它(例如修復進度條問題),我現在需要進行遠征計算以確定您將其隱藏的位置。

所以IMO,如果窗體調用的類,它的東西,那類返回進度的通知,這是處理在調用形式這些通知是一個好主意。

相關問題