0

我们正在制作一个从 ftp 服务器下载和上传 xml(最大 500kb)文件的程序。我们需要制作一个上传屏幕。我们尝试了三种方法。在第一种方法中,我们使用了一个 .gif 文件,该文件显示了一个加载屏幕,我们将其放入图片框中。之后,在我们处理上传/下载函数之前,我们让图片框可见,当函数完成时,我们让它不可见。但它没有用:(这是代码:

private void button2_Click(object sender, EventArgs e)//upload button
{

    picturebox1.visible=true;  //.gif file
    upload();
    picturebox1.visible=false;
}

这是上传功能:

void upload()
{
    FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create("ftp://" + IP + ":" +                  Port + downdest + xmlfile);

    request.Method = WebRequestMethods.Ftp.UploadFile;
    request.Credentials = new NetworkCredential(username, password);
    request.UsePassive = true;
    request.UseBinary = true;
    request.KeepAlive = false;

    //Load the file
    FileStream stream = File.OpenRead("apartman.xml");
    byte[] buffer = new byte[stream.Length];

    stream.Read(buffer, 0, buffer.Length);
    stream.Close();

    //Upload file
    Stream reqStream = request.GetRequestStream();
    reqStream.Write(buffer, 0, buffer.Length);
    reqStream.Close();
}

使用此代码,上传工作,但我们没有看到图片。当上传代码不起作用时,我们也看不到加载屏幕。

然后我们尝试了多线程,但是 c# 不允许我们在单独的线程中使用这段代码。

picturebox1.visible=true;

它说的是:“你不能也称它为bla bla ...”。我不记得了,也删除了代码,很抱歉缺少信息。

最后我们尝试使用后台工作程序,代码如下:

public Form1()
{
    CheckForIllegalCrossThreadCalls = false;
    InitializeComponent();
}
private void button2_Click(object sender, EventArgs e)//upload button
{
    backgroundWorker1.RunWorkerAsync();
}


private void upload()
{
    backgroundWorker1.ReportProgress(i);
}

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    //upload
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar1.Value = e.ProgressPercentage;
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    MessageBox.Show("upload complete");
}

此代码还给出了一条错误消息,指出:

错误 1 ​​文件具有无效值 ""updates":"。path.xml2 中的非法字符

有谁知道编程加载屏幕的正确方法?
如果您需要更多详细信息,我肯定可以回答您的问题。

4

1 回答 1

1

第一个片段中的问题是 UI 线程没有足够的时间来更改加载图像的状态:当您通过更改其可见性来显示图像时,您会立即开始上传过程,这会阻塞 UI 线程并防止它使您的更改生效,即显示您的加载图像。

上传完成后,您会立即隐藏您的图像。在那一刻,UI 线程尝试显示您的图像(待生效的更改)并在此之后立即隐藏您的图像,这解释了为什么您永远看不到它。

要更正此行为,您需要在另一个线程中移动上传过程。您尝试这样做但未能成功使其工作。

有很多方法可以做到这一点,具体取决于您的 .NET 版本。后台工作人员是个好人,可能是您最好的选择。只要确保,每当您想从线程上下文中更新 UI 时,您正在使用调度程序来更新它:

Dispatcher dispUI = Dispatcher.CurrentDispatcher;
dispUI.BeginInvoke(new Action(() => {
            //From here you can safely 
            //hide your loading image
        }), null
            );
于 2013-08-23T09:43:14.963 回答