2013-07-30 35 views
0

我有一個問題,我有我的GUI主類,二類(FTP)經營FTP,第三類(ServerClass)收集有關信息(用戶名,傳球,地址,時間等)的全部信息和第四類(ManagingClass),它們全部運行它(它使用字典來存儲它們)。BackgroundWorker的超過兩個班

當用戶點擊添加,主類首先檢查它是否可以連接到服務器,然後才就其添加到字典中。它將所有信息發送到ManagingClass的方法,該方法檢查連接並通過將其發送到來自另一個類(FTP)的方法來返回bool。它運行良好。

但是,因爲檢查連接是耗時的,並且它檢查gui沒有響應(並且將來當它下載大文件 - gui會長時間不響應),我決定添加progressBar,以便顯示進展。我開始閱讀關於BackgroundWorker的和的BeginInvoke(report progress backgroundworker from different class c#How can we show progress bar with FtpWebRequest等),但我有一個問題: 我需要它來了兩個班的工作 - 表 - > ManagingClass - > FTP,返回true或false和發送progressupdate。

FTP方法:

public bool checkConnection() 
    { 
     try 
     { 
      ftpRequest = (FtpWebRequest)WebRequest.Create(@"ftp://" + host); 
      OnProgressUpdate(25); 
      ftpRequest.Method = WebRequestMethods.Ftp.ListDirectory; 
      OnProgressUpdate(50); 
      ftpRequest.Credentials = new NetworkCredential(user, password); 
      OnProgressUpdate(75); 
      ftpRequest.GetResponse(); 
      OnProgressUpdate(100); 


     } 
     catch 
     { 
      return false; 
     } 
     return true; 

    } 

在ManagingClass

public bool checkConnection(string serverAddress) 
    { 
     checkingBackgroundWorker.RunWorkerAsync(serverAddress); 
     return Result; 

    } 

    private void checkingBackgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     string serverAddress = e.Argument as string; 
     ServerClass server; 
     serverDictionary.TryGetValue(adresSerwera, out server); 
     FTP whatever = new FTP(server); 
     whatever.OnProgressUpdate += whatever_OnProgressUpdate; 


     e.Result = whatever.checkConnection(); 

    } 

    private void checkingBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     Result = (bool)e.Result; 
    } 

在我的表格:

所有的
  string[] temp = AllToStringa(); 
      managingClass.AddFromForm(temp); 

      if (!managingClass.checkConnection(temp[0])) 
      { ... 

    private void managingClass_OnProgressUpdate(int value) 
    { 
     base.Invoke((Action)delegate 
     { 
      progressBarDownload.Value = value; 
     }); 
    } 

首先 - 是不是有做一些更好的辦法? ; p它看起來不直觀

其次 - 不幸的是在我的正處級當我這樣做的RunWorkerAsync似乎不復制對象,所以serverDictionary.TryGetValue返回異常,因爲serverDictionary = NULL(而它在構造函數創建)創建ManagingClass的新實例。從理論上講,我可以每次只發送由EventArgs的所需的所有信息,但它在某種程度上似乎髒,P,但是如果沒有其他的方式..

+0

當您在發佈前翻譯然後測試(編譯)它以確保它是正確的或完全不做。 –

+0

你'返回結果;'不能工作,你不需要'調用()''中OnProgressUpdate()'和'TryGetValue(adresSerwera,...)'是不是線程安全的。但是這些都不能解釋你所看到的。 –

回答