• c# 中的线程和同步


    一、新建线程的3种方法

      a)异步委托;b)Thread类;c)线程池;

    二、异步委托

      1、简单使用,检查委托是否完成其任务 

        a) 通过 BeginInvoke()  的返回值IAsyncResult 中的成员IsCompleted判断

        b)通过 BeginInvoke()  的返回值IAsyncResult 中的成员AsyncWaitHandle.WaitOne(50,false) 函数判断

        c)通过异步回调判断

      2、获取返回值

        通过EndInvoke 函数获取

    三、Thread类

      1、简单使用

      2、给线程传递数据(可以将执行的耗时函数放到一个类中,通过类成员变量传递参数)

    四、线程池 (ThreadPool 类来管理线程) 

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    
    namespace ThreadExam
    {
        /// <summary>
        /// MainWindow.xaml 的交互逻辑
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
            }
            public delegate int AsyncDelegate(int data, int ms);
    
            static int timeConsumingWork(int data, int ms)
            {
                return 0;
            }
            static void workForThread(object data)
            {
                Debug.WriteLine(data);
            }
            static void resultCompleted(IAsyncResult ar)
            {
                int result = (ar.AsyncState as AsyncDelegate).EndInvoke(ar);
                Debug.WriteLine(result);
            }
            private void async_Click(object sender, RoutedEventArgs e)
            {
                Button asyBtn = sender as Button;
                switch (asyBtn.Name)
                {
                    case "async1":
                        AsyncDelegate asyDeleg = timeConsumingWork;
                        IAsyncResult ar = asyDeleg.BeginInvoke(1, 3000, null, null);
                        while (!ar.IsCompleted)  //一直判断状态
                        {
                            Console.Write(".");
                            Thread.Sleep(50);
                        } 
                        int result = asyDeleg.EndInvoke(ar);
                        Debug.WriteLine(result);
                        break;
                    case "async2":
                        AsyncDelegate asyDeleg2 = timeConsumingWork;
                        IAsyncResult ar2 = asyDeleg2.BeginInvoke(1, 3000, null, null);
                        while (true)
                        {
                            Console.Write(".");
                            if (ar2.AsyncWaitHandle.WaitOne(50, false))  //等待50毫秒后看状态
                            {
                                break;
                            }
                        } 
                        int result2 = asyDeleg2.EndInvoke(ar2);
                        Debug.WriteLine(result2);
                        break;
                    case "async3":
                        AsyncDelegate asyDeleg3 = timeConsumingWork;
                        asyDeleg3.BeginInvoke(1, 2000, resultCompleted, asyDeleg3);
                        break;
                    case "thread1":
                        new Thread(workForThread).Start(100000);
                        break;
                    case "pool1":
                        for (int i = 0; i < 100;i++ )
                            ThreadPool.QueueUserWorkItem(workForThread, 123);
                        break;
                }
            }
        }
    }
    View Code

     链接:http://pan.baidu.com/s/1boXqVvx 密码:hqc3

    参考:http://www.cnblogs.com/nokiaguy/archive/2008/07/13/1241817.html

      

  • 相关阅读:
    allocation size overflow
    数据库隔离级别深入理解(ORACLE)
    查看Orcale数据里的表是否有变化
    意外发现抽象类的构造器
    C语言学习快速笔记
    由javascript的闭包引申到程序语言编译上的自由变量作用域的考量
    easyui的datagrid的列checkbox自定义增加disabled选项
    数据库连接不关闭造成的问题以及RowSet的使用
    Quartz的JobDetail没有触发器指向时会被删除的问题
    发现浏览器开发工具的一个小问题
  • 原文地址:https://www.cnblogs.com/lwngreat/p/5908854.html
Copyright © 2020-2023  润新知