两个班的背景工作人员

本文关键字:背景 工作人员 两个 | 更新日期: 2023-09-27 18:25:38

我有一个问题,我的主类有gui,第二类(FTP)操作FTP,第三类(ServerClass)收集所有信息(用户名、通行证、地址、时间等),第四类(ManagingClass)操作所有信息(使用字典存储)。

当用户单击添加时,主类首先检查它是否可以连接到服务器,然后才将它添加到字典中。它将所有信息从ManagingClass发送到检查连接的方法,并通过将其发送到另一个类(FTP)的方法来返回bool。它运行良好。

但由于检查连接很耗时,而且在检查gui没有响应时(将来当它下载大文件时,gui将在很长一段时间内没有响应),我决定添加progressBar,这样它就会显示进度。我开始阅读关于BackgroundWorker和BeginInvoke(报告不同类c#的进度BackgroundWorker,我们如何使用FtpWebRequest等显示进度条),但我有一个问题:我需要它在两个类上工作——Form->ManagingClass->FTP,返回true或false并发送progresupdate。

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不知何故,似乎没有直觉

第二,不幸的是,在我的管理类中,当我执行RunWorkerSync时,它似乎在不复制对象的情况下创建了ManagingClass的新实例,因此serverDictionary.TryGetValue返回异常,因为serverDictionary=null(当它在构造函数中创建时)。理论上,我可以每次发送事件参数所需的所有信息,但不知何故,它看起来很脏;p,但如果没有其他方法。。

两个班的背景工作人员

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