• 步步为营-64-进程&线程


    1 进程

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 进程线程
    {
        class Program
        {
            static void Main(string[] args)
            {
                //获取当前进程
                Process p1 = Process.GetCurrentProcess();
                Console.WriteLine(p1.Id);
                Console.WriteLine(p1.ProcessName);
    
                //打开新的进程
                Process p2 = Process.Start("cmd.exe");
                string  key = Console.ReadLine();
                if (key=="k")
                {
                    //杀死进程
                    p2.Kill();
                }
                Console.ReadLine();
    
    
            }
        }
    }
    View Code

    2 应用程序域

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 应用程序域
    {
        class Program
        {
            static void Main(string[] args)
            {
                //01 获取当前应用程序域
                AppDomain ad = AppDomain.CurrentDomain;
                Console.WriteLine(ad.FriendlyName);
                //02 在当前程序域中打开程序集,不会开启新进程
                AppDomain ap2= AppDomain.CreateDomain("xyxtl");
               int id = ap2.ExecuteAssembly("进程线程.exe");
                Console.Write(id);
    
               Console.ReadKey();
            }
        }
    }
    View Code

    3 线程

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace 线程
    {
        class Program
        {
            static void Main(string[] args)
            {
                #region 01 获取当前线程-默认程序启动后,会有一个主线程
                Thread t1 = Thread.CurrentThread;
                Console.WriteLine(t1.ManagedThreadId);
                #endregion
    
    
                #region 02 开辟一个新线程 - 02-01 无参;02-02 有参
                //02-01 有参
                Thread t2 = new Thread(() =>
                {
                    Console.WriteLine(Thread.CurrentThread.ManagedThreadId);//输出当前线程编号
                    Console.WriteLine("无参,构造函数!");
                });
                t2.Start();
    
                //02-02 有参
                #endregion
    
                Thread t3 = new Thread((p) =>
                {
                    //由于参数是object类型,如果想访问对象特有成员,需要进行类型转换
                    Person p2 = p as Person;
                    if (p2!=null)
                    {
                        ;
                        Console.WriteLine(p2.Age);
                    }
                    
                    Console.WriteLine(p.ToString());
                });
                t3.Start(new Person()
                {
                    Name = "张三",
                    Age = 18,
                });
                Console.Read();
            }
    
            public class  Person
            {
                public string Name { get; set; }
                public int Age { get; set; }
    
                public override string ToString()
                {
                    return string.Format("姓名:{0},年龄{1}",Name,Age);
                }
            }
        }
    }
    View Code

    3.2 IsBackground属性

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace 前台线程与后台线程
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                Thread t1 = new Thread(() =>
                {
                    while (true)
                    {
                        Console.WriteLine(1);
                    }
                });
                //休息5秒
               // Thread.Sleep(5000);
               
                t1.Start();
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                Thread t1 = new Thread(() =>
                {
                    while (true)
                    {
                        Console.WriteLine(2);
                    }
                });
                t1.IsBackground = true;
                t1.Start();
            }
        }
    }
    View Code

    当线程是后台线程时,主线程关闭,后台线程也随之关闭;
    当线程是前台线程时,主线程关闭,前台线程不关闭;

    3.3 join 属性,阻塞join代码所在的当前线程==插队

    4 lock

    问题的引出

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace Lock锁
    {
        class Program
        {
            static void Main(string[] args)
            {
                int num = 0;
                
                Thread th = new Thread(() =>
                {
                    for (int i = 0; i < 10000000; i++)
                    {
                        num--;
                    }
                });
                th.IsBackground = true;
                th.Start();
    
                for (int i = 0; i < 10000000; i++)
                {
                    num++;
                }
    
                Console.WriteLine(num);
                Console.ReadKey();
            }
        }
    }
    View Code

    解决方法:加锁

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace Lock锁
    {
        class Program
        {
            static void Main(string[] args)
            {
                int num = 0;
                
                Thread th = new Thread(() =>
                {
                    for (int i = 0; i < 10000000; i++)
                    {
                        lock ("B")
                        {
                            num --; 
                        }
                    }
                });
                th.IsBackground = true;
                th.Start();
    
                for (int i = 0; i < 10000000; i++)
                {
                    lock ("B")
                    {
                        num ++;
                    }
                }
    
                Console.WriteLine(num);
                Console.ReadKey();
            }
        }
    }
    View Code

     5 栈 stack

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 栈
    {
        class Program
        {
            static void Main(string[] args)
            {
                //定义栈
                Stack<BaoZi> bzStack = new Stack<BaoZi>( );
                //入栈
                bzStack.Push(new BaoZi());
                //出栈
                if (bzStack.Count>0)
                {
                   BaoZi bz= bzStack.Pop();
                }
    
            }
    
            public class BaoZi 
            {
            }
        }
    }
    View Code

    6 线程池

      线程池中的线程都是后台线程

      不能手动设置每个线程的属性(前台,优先级)

      比较短的任务考虑线程池,比较长的任务考虑手动创建一个线程

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace 线程池
    {
        class Program
        {
            static void Main(string[] args)
            {
                for (int i = 0; i < 10; i++)
                {
                    ThreadPool.QueueUserWorkItem((obj) =>
                        {
                            Console.WriteLine(obj+"_"+Thread.CurrentThread.ManagedThreadId);
                            Thread.Sleep(100);
                        },i
                        );
                }
                Console.Read();
            }
        }
    }
    View Code

    7 异步方式调用委托对象

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace 异步方式调用委托对象
    {
        class Program
        {
            static void Main(string[] args)
            {
                //定义一个委托
                Action<string> s1 = (s) =>
                {
                    Console.WriteLine(s+"_"+ Thread.CurrentThread.ManagedThreadId);
                };
                //委托的实现-01
                //s1("张三");
                //委托的实现-02 异步调用实现委托
                s1.BeginInvoke("张三",Func1,"");
    
                //获取主线程id 
                Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
                
                Console.ReadKey();
            }
    
            #region 委托实现后的回调函数
            private static void Func1(IAsyncResult ar)
            {
                Console.WriteLine("李四"+"_"+Thread.CurrentThread.ManagedThreadId);
            } 
            #endregion
        }
    }
    View Code

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    
    namespace 异步方式调用委托对象
    {
        class Program
        {
            static void Main(string[] args)
            {
                //定义一个委托
                Action<string> s1 = (s) =>
                {
                    Console.WriteLine(s+"_"+ Thread.CurrentThread.ManagedThreadId);
                };
                //委托的实现-01
                //s1("张三");
                //委托的实现-02 异步调用实现委托
               IAsyncResult result = s1.BeginInvoke("张三",Func1,"");
                //保证委托执行完成后,执行后续代码
                //只保证委托执行完成,不保证回调函数也执行完成
                s1.EndInvoke(result);
    
                //获取主线程id 
                Console.WriteLine(Thread.CurrentThread.ManagedThreadId);
                
                Console.ReadKey();
            }
    
            #region 委托实现后的回调函数
            private static void Func1(IAsyncResult ar)
            {
                Console.WriteLine("李四"+"_"+Thread.CurrentThread.ManagedThreadId);
            } 
            #endregion
        }
    }
    View Code

    8 并行计算

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace 并行计算
    {
        class Program
        {
            static void Main(string[] args)
            {
                Stopwatch  sp = new Stopwatch();
                sp.Start();
                //普通计算
                //for (int i = 0; i < 100000; i++)
                //{
                //    Console.WriteLine(i);
                //}
                //并行计算
                Parallel.For(1, 100000, (i) => { Console.WriteLine(i); });
                sp.Stop();
                Console.WriteLine(sp.Elapsed);
                Console.ReadKey();
            }
        }
    }
    View Code

  • 相关阅读:
    取得GridPanel选定行所有字段值
    从少林寺的核心竞争力看软件作坊和正规军的差异
    估算软件项目成本
    Delphi FastReport报表常用方法
    少林寺的组织结构分析
    embed标签使用
    C# 多种方式播放Wav声音
    js 关闭浏览器
    ExtJS GridPanel根据条件改变字体颜色
    [Jsp] 如何在JSP页面快速输出从Servlet接收的数据_看JSTL常用C标签的威力
  • 原文地址:https://www.cnblogs.com/YK2012/p/6918111.html
Copyright © 2020-2023  润新知