我有一个问题,我的主类是 gui,第二类(FTP)操作 FTP,第三类(ServerClass)收集有关(用户名、密码、地址、时间等)的所有信息,第四类(ManagingClass)操作它们(它使用字典来存储它们)。
当用户单击添加时,主类首先检查它是否可以连接到服务器,然后才将其添加到字典中。它将所有信息从ManagingClass 发送到方法,该方法检查连接并通过将其发送到另一个类- FTP 的方法返回bool。它工作得很好。
但是因为检查连接非常耗时,而且它检查 gui 没有响应(并且在将来它会下载大文件时 - gui 将很长时间没有响应)我决定添加 progressBar 以便它显示进度。我开始阅读有关 BackgroundWorker 和 BeginInvoke (报告来自不同类 c# 的进度 backgroundworker,我们如何使用 FtpWebRequest等显示进度条)但我有一个问题:我需要它在两个类上工作 - Form ->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;
}
在管理类
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 时,它似乎在不复制对象的情况下创建了ManagingClass 的新实例,因此 serverDictionary.TryGetValue 返回异常,因为 serverDictionary = null (虽然它是在构造函数中创建的)。从理论上讲,我每次都可以发送 eventargs 所需的所有信息,但它似乎很脏;p 但如果没有其他方法..