問題があります。GUI を使用したメイン クラス、FTP を操作する 2 番目のクラス (FTP)、(ユーザー名、パス、アドレス、時間など) に関するすべての情報を収集する 3 番目のクラス (ServerClass)、および 4 番目のクラス (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;
}
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 どういうわけか直感的ではないようです
そして2番目-残念ながら私の管理クラスでは、RunWorkerAsyncを実行すると、オブジェクトをコピーせずにManagingClassの新しいインスタンスを作成するように見えるため、serverDictionary.TryGetValueはserverDictionary = null(コンストラクターで作成されている間)のため例外を返します。理論的には、eventargs に必要なすべての情報を毎回送信することもできますが、どういうわけか汚れているように見えますが、他に方法がない場合..