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);
    }
    
  • 相关阅读:
    LeetCode 189. Rotate Array
    LeetCode 965. Univalued Binary Tree
    LeetCode 111. Minimum Depth of Binary Tree
    LeetCode 104. Maximum Depth of Binary Tree
    Windows下MySQL的安装与配置
    LeetCode 58. Length of Last Word
    LeetCode 41. First Missing Positive
    LeetCode 283. Move Zeroes
    《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践》读后感
    删除docker下的镜像
  • 原文地址:https://www.cnblogs.com/anjun-xy/p/12868201.html
Copyright © 2011-2022 走看看