C# 多任务网段扫描练习(TASK)

1.步骤1,界面
在这里插入图片描述
2.步骤2
只对之前Tread部分进行了修改,利用Task.Run()对一般方法进行定义任务。其余除List类型放生变化,其余和多线程一样。

namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            tb.Visibility = Visibility.Hidden;
        }
        string hostname;
        List<Thread> threads = new List<Thread>();
        Stopwatch SumSW = new Stopwatch();
        Stopwatch sw1 = new Stopwatch();
        Object obj = new object();
        int num = 0;
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            num = 0;
            threads.Clear();
            Button mybutton = sender as Button;
            string strCurrent = mybutton.Content.ToString();
            int n = int.Parse(t3.Text) - int.Parse(t2.Text);
            if(n<0)
            {
                MessageBox.Show("地址范围有错");
                return;
            }
            listbox.Items.Clear();
            for (int i = 0; i <= n; i++)
            {
                
                int n2 = int.Parse(t2.Text) + i;
                string lip = n2.ToString();
                string strIP = t1.Text + lip;
                if (strCurrent=="单线程")
                {
                    SumSW.Start();
                    GetInfo(strIP);
                }
                else
                {
                    Thread t = new Thread(GetInfo);
                    SumSW.Start();
                    t.Start(strIP);
                    threads.Add(t);
                }                                               
            }
            
        }
        
        
        public void GetInfo(Object strIP)
        {
            
            string strIP2 = strIP as string;
            try
            {
                IPAddress ip = IPAddress.Parse(strIP2);
            }
            catch(Exception)
            {
                tb.Visibility = Visibility.Visible;
            }
            sw1.Start();
            try
            {
                hostname = Dns.GetHostEntry(strIP2).HostName;
            }
            catch (Exception)
            {

                hostname = "(不在线)";
            }
            sw1.Stop();
            listbox.Dispatcher.Invoke(() =>
              {
                  listbox.Items.Add("扫描地址:" + strIP + "扫描时间"+sw1.ElapsedMilliseconds+ "毫秒,主机DNS名称:" + hostname);
                  
              });
            lock(obj)
           {
                num++;
            }
            if(num==threads.Count)
            {
                SumSW.Stop();
                listbox.Dispatcher.Invoke(() =>
                {
                    listbox.Items.Add("扫描总时间" + SumSW.ElapsedMilliseconds + "毫秒");
                });
                
            }
        }
    }
}

问题讨论:
1.方法名没加async

2.task.add加在了await前面,导致按次输出等待并导致num一直等于t.Count每次都输出总时间。删去await解决

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值