zoukankan      html  css  js  c++  java
  • 不卡界面,实现文件上传

    • 需求
    • 往公司的ftp服务器上传文件,实现一个winform测试工具,要求:
    • 1、整个过程不卡界面
    • 2、界面的TextArea里依次显示:开始上传 , 上传中...(小点循环从1~3,与此同时开一个线程在后台执行文件上传),上传成功或异常。
    • 下面代码中关键知识点:invoke和begininvoke 区别--Invoke()的作用是:在应用程序的主线程上执行指定的委托。
    private void button2_Click(object sender, EventArgs e)
    {//UI线程显示:开始上传 , 上传中...(点循环从1~3) 同时一个后台线程在执行上传,上传成功。
    	string localPath = textBox3.Text.Trim();
    	string serverPath = textBox4.Text.Trim();
    	txtResult.Text = "开始上传";
    	Thread thread = new Thread(() =>
    	{ 
    		string ip = textBox1.Text.Trim();
    		int port = int.Parse(textBox2.Text.Trim());
    		if (txtResult.InvokeRequired)//跨线程调用
    		{
    			txtResult.Invoke(new Action(() =>
    			{
    				string a = $"* 开始上传 {DateTime.Now.ToString()} , {xmlLocalPath}";
    				txtResult.Text = txtResult.Text + "
    " + a;
    			}));//传入一个委托 找到创建控件的线程执行传入的方法
    		}
    		try
    		{
    			Thread.Sleep(4000);//停顿4s模拟上传过程
    		}
    		catch (Exception ex)
    		{
    			if (txtResult.InvokeRequired)
    			{
    				txtResult.Invoke(new Action(() =>
    				{
    					string b = $"* 上传异常 {DateTime.Now.ToString()}";
    					txtResult.Text = txtResult.Text + "
    " + b;
    				})); 
    			}
    		}
    		if (txtResult.InvokeRequired)
    		{
    			txtResult.Invoke(new Action(() =>
    			{
    				string b = $"* 上传完毕 {DateTime.Now.ToString()}";
    				txtResult.Text = txtResult.Text + "
    " + b;
    			}));//传入一个委托 找到创建控件的线程执行传入的方法
    		}
    	});
    	thread.Start();
    }
    

    其他

    • 为啥界面不实时更新0~100%进度信息? 因为主线程一直忙,只有闲下来才会去更新textBox1,解决办法:可以让子线程干事,主线程一直闲着就ok了。
    private void button1_Click(object sender, EventArgs e)
    {
    /* 本代代码:界面并不会实时更新0~100%进度信息
    for (int i = 0; i < 100; i++)
    {
        Thread.Sleep(20);
        textBox1.Text = $"进度{i}%";
    }*/
    	Action ac = () =>
    	{
    		for (int i = 0; i < 100; i++)
    		{
    			Thread.Sleep(20);
    			if (textBox1.InvokeRequired)
    			{
    				textBox1.Invoke(new Action<int>((num) =>
    				{
    					textBox1.Text = $"进度{i}%";//文本框快速滚动显示1~99%
    				}), i);
    			}
    		}
    	};
    	ac.BeginInvoke(null, null);
    }
    
  • 相关阅读:
    技术债务MartinFlower
    如何定义产品愿景
    领域驱动设计阶段知识总结
    领域驱动设计的价值
    什么是数字产品
    NestOS 发布:基于华为欧拉开源系统的云底座操作系统
    架子鼓MIDI及相关软件
    TM4 JDK1.8连接SqlServer报错:The driver could not establish a secure connection to SQL Server by using Secure Sockets Layer (SSL)
    关于GPL协议的理解(开源与商用、免费与收费的理解)
    nest js 限制客户端在一定时间内的请求次数
  • 原文地址:https://www.cnblogs.com/anjun-xy/p/12868201.html
Copyright © 2011-2022 走看看