我有一個問題,我有我的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,但是如果沒有其他的方式..
當您在發佈前翻譯然後測試(編譯)它以確保它是正確的或完全不做。 –
你'返回結果;'不能工作,你不需要'調用()''中OnProgressUpdate()'和'TryGetValue(adresSerwera,...)'是不是線程安全的。但是這些都不能解釋你所看到的。 –