[英]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.