zoukankan      html  css  js  c++  java
  • 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

      

  • 相关阅读:
    Ant安装及环境配置
    tp5 自定义公共函数,前台模板调用
    Linux下查看当前文件大小的命令
    超级好用的视频压缩工具
    ubuntu 安装 gd
    wordpress Error establishing a database connection问题
    wordpress 上传图片出现权限或者http错误
    nginx解决WordPress 上传到服务器后页面404错误的方法
    ubuntu mysql新增用户并开启远程连接
    linux每日命令(21): find命令之exec
  • 原文地址:https://www.cnblogs.com/lwngreat/p/5908854.html
Copyright © 2011-2022 走看看