美文网首页C#
C#多线程编程

C#多线程编程

作者: 金戈大王 | 来源:发表于2017-05-04 21:15 被阅读1603次

    1、线程分为前台线程和后台线程,应用程序在所有前台线程结束后退出。

    2、使用Thread创建前台线程:

    Thread t1 = new Thread(Function1);
    t1.Start();
    
    private static void Function1()
     {
         Thread.Sleep(1000);//模拟耗时操作,睡眠1s
         Console.WriteLine("前台线程被调用!");
     }
    

    3、使用Thread创建带参数的后台线程

    Thread t2= new Thread(new ParameterizedThreadStart(Function2));
    t2.IsBackground = true;//设置为后台线程
    t2.Start("传参");
    
    private static void Function2(object data)
     {
         Thread.Sleep(2000);//模拟耗时操作,睡眠2s
         Console.WriteLine("后台线程被调用!" + data);
     }
    

    4、使用ThreadPool创建后台线程

    Console.WriteLine("主线程开始!");
    //创建要执行的任务
    WaitCallback workItem = state => Console.WriteLine("当前线程Id为:" + Thread.CurrentThread.ManagedThreadId);
    //重复调用10次
    for (int i = 0; i < 10; i++)
    {
        ThreadPool.QueueUserWorkItem(workItem);
    }
    Console.ReadLine();
    

    5、并行For循环

    ParallelLoopResult result = Parallel.For(0, 100, i => {
        Console.WriteLine("{0}, task: {1} , thread: {2}", i, Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
    });
    

    6、启动Task

    • 方式一:
    Task.Factory.StartNew(() => Console.WriteLine("Task running."));
    
    • 方式二:
    Task.Run(() => Console.WriteLine("Task running."));
    
    • 接收返回值的Task
    Console.WriteLine("主线程ID:" + Thread.CurrentThread.ManagedThreadId);
    Task<string> task = Task.Run(() =>
    {
        return Thread.CurrentThread.ManagedThreadId.ToString();
    });
    Console.WriteLine("创建Task对应的线程ID:" + task.Result);
    Console.ReadLine();
    

    7、async/await异步编程

    static void Main(string[] args)
    {
        //主线程调用AsyncCaller方法,被async标记的方法将会在合适的时候异步执行
        var task = AsyncCaller();
        //主线程调用task.Result等待异步执行结果
        Console.WriteLine(task.Result);       //3
        Console.ReadKey();
    }
    private static async Task<string> AsyncCaller()
    {
        //await标记了一个等待点
        var str = await AsyncFunction();      //2
        return str;
    }
    private static Task<string> AsyncFunction()
    {
        //下面就是将要被异步执行的任务,主线程到这里就会返回
        return Task.Run(() =>           //1
        {
            return "AsyncFunction()执行完毕";
        });
    }
    

    主线程执行到1处后,函数AsyncFunction返回,接着AsyncCaller直接从2处返回,并执行到3处等待。异步线程执行完毕后,返回到2处,继续向后执行,返回值传递给task.Result,异步线程结束。

    参考资料

    .Net异步编程知多少 圣杰

    相关文章

      网友评论

        本文标题:C#多线程编程

        本文链接:https://www.haomeiwen.com/subject/cqxdtxtx.html