C#中的多线程实现和注意事项

using System.Threading.Tasks;
using System.Threading;
using System.Net.Sockets;
using System.Net;


==============================================================================
 Task t = new Task(() =>
     {
        //To Do you code  也可以在这直接调用方法,直接传递参数,也比较方便
     });

t.Start();
================================================================================

listBox1.Items.Clear();           //清空
===================================================================================
//用内置委托Action实现UI组件刷新

 Action<int> action = (data) =>                    //INT可以改为String等其他格式,根据你要显示的内容灵活组合
                {
                listBox1.Items.Add(data);
                };
                Invoke(action, i);



//委托同步执行,Action 与 Func是.NET类库中增加的内置委托,以便更加简洁方便的使用委托。

内置委托类型,顾名思义Action和Func本身就是已经定义好的委托类型。两种委托类型的区别在于:Action委托签名不提供返回类型,而Func提供返回类型。

Action委托具有Action<T>、Action<T1,T2>、Action<T1,T2,T3>……Action<T1,……T16>多达16个的重载,其中传入参数均采用泛型中的类型参数T,涵盖了几乎所有可能存在的无返回值的委托类型。
Func则具有Func<TResult>、Func<T,Tresult>、Func<T1,T2,T3……,Tresult>17种类型重载,T1……T16为出入参数,Tresult为返回类型。
===================================================================================
Thread thread = new Thread(new ThreadStart(Test));
thread.IsBackground = true;      //设置为后台线程      
thread.Start();

//这个方法也可以启动多线程

====================================================================================
实例:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Net.Sockets;
using System.Net;

namespace TASK
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

           // Control.CheckForIllegalCrossThreadCalls = false;//关闭安全检查,为了安全一般不采用此代码
        }
        
        private void button1_Click(object sender, EventArgs e)
        {

            listBox1.Items.Clear();  //清空原数据
            Task t = new Task(() =>
            {
                saomiao();                                      
            });
            t.Start();
        }
        private void saomiao()
        {
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            IPAddress ip = IPAddress.Parse(textBox1.Text);
            int port, port1, port2;

            port1 = Convert.ToInt32(textBox2.Text);
            port2 = Convert.ToInt32(textBox3.Text);

            for (port = port1; port <= port2; port++)                         //端口循环扫描控制
            {
                try
                {
                    sock.Connect(new IPEndPoint(ip, port));                   //链接
                    //this.SetText(port.ToString() + "   号端口连接服务器成功");
                    Action<String> ac = (data) =>
                    {
                        listBox1.Items.Add(data);
                    };
                    Invoke(ac, port.ToString() + "    号端口连接服务器失败");
                    //resuat1.Items.Add(port.ToString() + "   号端口连接服务器成功");
                }
                catch
                {
                    //this.SetText(port.ToString() + "   号端口连接服务器失败");
                    //resuat1.Items.Add(port.ToString() + "    号端口连接服务器失败");
                    Action<String> ac = (data) =>
                    {
                        listBox1.Items.Add(data);
                    };
                    Invoke(ac, port.ToString() + "    号端口连接服务器失败");
                }
            }
            //resuat1.Items.Add("扫描结束......");
            Action<String> action = (data) =>
            {
                listBox1.Items.Add(data);
            };
            Invoke(action, "扫描完毕......");
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }
    }
}

  

posted @ 2020-04-28 00:02  狗狗王  阅读(547)  评论(0编辑  收藏  举报