繁体   English   中英

上传屏幕Winforms C#

[英]Uploading screen winforms c#

我们正在制作一个程序,可从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;

上面写着:“您也不能这样称呼……”。 我不记得了,也删除了代码,对不起,缺少信息。

最后,我们尝试使用backgroundworker,这是代码:

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文件具有无效的值“”更新“:”。 path.xml2中的非法字符

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

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

上传完成后,您立即隐藏图像。 那时,UI线程尝试显示您的图像(即将生效的更改)并在此之后立即隐藏您的图像,这解释了为什么您从未看到它。

若要更正此行为,您需要在另一个线程中移动上载过程。 您尝试执行的操作但未成功完成。

有多种方法可以执行此操作,具体取决于您的.NET版本。 后台工作者是一个很好的选择,也许是您最好的选择。 只要确保每当您想要从线程上下文中更新UI时,就使用调度程序对其进行更新:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM