0

問題があります。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 に必要なすべての情報を毎回送信することもできますが、どういうわけか汚れているように見えますが、他に方法がない場合..

4

1 に答える 1

0

はい、非同期プログラムを作成するより良い方法は、Async と Await です。詳細については、次のリンクを参照してください: http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

于 2013-07-30T08:58:14.857 に答える