正在上传屏幕winforms c#

本文关键字:winforms 屏幕 | 更新日期: 2023-09-27 18:28:48

我们正在制作一个程序,从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"无效:"。路径.xml2 中存在非法字符

有人知道加载屏幕编程的正确方法吗
如果你需要更多的细节,我当然可以回答你的问题。

正在上传屏幕winforms c#

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

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

要纠正这种行为,您需要在另一个线程中移动上载进程。你试着去做,但没有成功。

根据你的.NET版本,有很多方法可以做到这一点。后台工作者是一个很好的选择,可能也是你最好的选择。只要确保,无论何时你想从线程上下文中更新UI,你都在使用调度器来更新它:

Dispatcher dispUI = Dispatcher.CurrentDispatcher;
dispUI.BeginInvoke(new Action(() => {
            //From here you can safely 
            //hide your loading image
        }), null
            );