0

我有一个问题,我的主类是 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 但如果没有其他方法..

4

1 回答 1

0

是的,创建异步程序的更好方法是 Async 和 Await。有关详细信息,请参阅以下链接:http: //msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

于 2013-07-30T08:58:14.857 回答