zoukankan      html  css  js  c++  java
  • ASP.NET多线程编程(一) 收藏

     Thread的使用
    using System;
    using System.Threading;
    public class ThreadExample
    {
     public static void ThreadProc()
     {
      for (int i = 0; i < 10; i++)
      {
       Console.WriteLine("ThreadProc: {0}", i);
       Thread.Sleep(0);
      }
     }
     public static void Main()
     {
      Console.WriteLine("在主进程中启动一个线程");
      Thread t = new Thread(new ThreadStart(ThreadProc));//创建一个线程
      t.Start();//启动线程
      Thread ts = new Thread(new ThreadStart(ThreadProc));//创建一个线程
      ts.Start();//启动线程
      ts.Suspend();//挂起该线程
      for (int i = 0; i < 4; i++)
      {
       Console.WriteLine("主进程输出……");
       Thread.Sleep(0);//线程被阻塞的毫秒数。0表示应挂起此线程以使其他等待线程能够执行
      }
      Console.WriteLine("主线程调用线程Join 方法直到ThreadProc1线程结束.");
      t.Join();//阻塞调用线程,直到某个线程终止时为止。
      Console.WriteLine("ThreadProc1线程结束");
      ts.Resume();
      //ts.IsBackground = true;//后台运行
     }
    }
    Thread中的参数传递
    using System;
    using System.Threading;
    namespace ThreadArgs
    {
     public class SimpleThread
     {
      private string procParameter = "";
      public  SimpleThread (string strPara)
      {
       procParameter = strPara;  
      }
      public  void WorkerMethod()
      {
       Console.WriteLine ("参数输入为: " + procParameter);
      }
     }
     class MainClass
     {
      static void Main(string[] args)
      {
       SimpleThread st = new SimpleThread("这是参数字符串!");
       Thread t  = new Thread( new ThreadStart( st.WorkerMethod ) );
       t.Start ();
       t.Join (Timeout.Infinite);  }
     }
    }
    Thread中委托的使用
    using System;
    using System.Threading;
    public class SimpleThread
    {
     public delegate void Start (object o);
     private class Args
     {
      public object o;
      public Start s;
      public void work()
      {
       s(o);
      }
     }
     public static Thread CreateThread (Start s, Object arg)
     {
      Args a = new Args();
      a.o = arg;
      a.s = s;
      Thread t = new Thread (new ThreadStart (a.work));
      return t;
     }
    }
    class Worker
    {
     public static void WorkerMethod(object o)
     {
      Console.WriteLine ("参数为: " + o);
     }
    }
    public class Work
    {
     public static void Main()
     {
      Thread t = SimpleThread.CreateThread (new SimpleThread.Start(Worker.WorkerMethod), "参数字符串");
      t.Start ();
      t.Join (Timeout.Infinite);
     }
    }
    线程跨越多个程序域
    using System;
    namespace AppDomainAndThread
    {
     class Class1
     {
      static void Main(string[] args)
      {
       AppDomain DomainA;
       DomainA=AppDomain.CreateDomain("MyDomainA");
       string StringA="DomainA Value";
       DomainA.SetData("DomainKey", StringA);
       CommonCallBack();
       CrossAppDomainDelegate delegateA=new CrossAppDomainDelegate(CommonCallBack);
       //CrossAppDomainDelegate委托:由 DoCallBack 用于跨应用程序域调用。
       DomainA.DoCallBack(delegateA); //在另一个应用程序域中执行代码
      }
      public static void CommonCallBack()
      {
       AppDomain Domain;
       Domain=AppDomain.CurrentDomain;
       Console.WriteLine("The value'"+Domain.GetData("DomainKey")+"'was found in "+Domain.FriendlyName.ToString()+"running on thread id:"+AppDomain.GetCurrentThreadId().ToString());
      }
     }
    }
    using System;
    using System.Threading;
    using System.Collections;
    namespace ClassMain
    {  delegate string MyMethodDelegate();
     class MyClass
     { 
      private static ArrayList arrList = new ArrayList();
      private static int i = 0;
      public static void Add()
      {
       arrList.Add(i.ToString());
       i++;
      }
      public static void LockAdd()
      {
       lock(arrList)
       {
         Add();
       }
      } 
      public static void InterlickedAdd()
      {
       Interlocked.Increment(ref i);
       arrList.Add(i.ToString());
      }
      public static void MonitorLock()
      {
       try
       {
        //I.不限时间
        //Monitor.Enter(arrList); 
        //II.在指定时间获得排他锁
        if(Monitor.TryEnter(arrList,TimeSpan.FromSeconds(30)))
         //在30秒内获取对象排他锁.
        {                                                                      
          Add();
        }
       }
       catch
       {
        //发生异常后自定义错误处理代码
       }
       finally
       {
        Monitor.Exit(arrList);  //不管是正常还是发生错误,都得释放对象
       }
      }
      static Thread[] threads = new Thread[10];
      [STAThread]
      static void Main(string[] args)
      {
       for(int i=0;i<3;i++)
       {
        Thread thread = new Thread(new ThreadStart(Add));
    //    Thread thread1 = new Thread(new ThreadStart(LockAdd));
    //    Thread thread = new Thread(new ThreadStart(InterlickedAdd)); 
    //    Thread thread = new Thread(new ThreadStart(MonitorLock));
        thread.Start();
       }
       Console.ReadLine();
       for(int i=0;i<arrList.Count;i++)
       {
        Console.WriteLine(arrList[i].ToString());
       }
      }
     }
    }
    通过委托异步调用方法
    using System;
    using System.Threading;
    using System.Runtime.Remoting.Messaging;
    namespace   ClassMain
    {
     //委托声明(函数签名)
     delegate string MyMethodDelegate();
     class MyClass
     {
      //要调用的动态方法
      public  string MyMethod1()
      {
       return "Hello Word1";
      }
      //要调用的静态方法
      public static string MyMethod2()
      {
       return "Hello Word2";
      }
     }
     class Class1
     {
      static void Main(string[] args)
      {
       MyClass myClass = new MyClass();
       //方式1:  声明委托,调用MyMethod1
       MyMethodDelegate d = new MyMethodDelegate(myClass.MyMethod1);
       string strEnd = d();  
       Console.WriteLine(strEnd);
       //方式2:  声明委托,调用MyMethod2 (使用AsyncResult对象调用)
       d = new MyMethodDelegate(MyClass.MyMethod2); //定义一个委托可以供多个方法使用     
       AsyncResult myResult;   //此类封闭异步委托异步调用的结果,通过AsyncResult得到结果.
       myResult = (AsyncResult)d.BeginInvoke(null,null);        //开始调用
       while(!myResult.IsCompleted)  //判断线程是否执行完成
       {
        Console.WriteLine("正在异步执行MyMethod2 .....");
       }
       Console.WriteLine("方法MyMethod2执行完成!");
       strEnd = d.EndInvoke(myResult);      //等待委托调用的方法完成,并返回结果 
       Console.WriteLine(strEnd);
       Console.Read();
      }
     }
    }
    利用多线程实现Web进度条
      private void btnDownload_Click(object sender, System.EventArgs e)
      {
       System.Threading.Thread thread=new System.Threading.Thread(new System.Threading.ThreadStart(LongTask));
       thread.Start();
       Session["State"]=1;
       OpenProgressBar(this.Page);
      }
      public static void OpenProgressBar(System.Web.UI.Page Page)
      {
       StringBuilder sbScript = new StringBuilder();
       sbScript.Append("<script language='JavaScript' type='text/javascript'>\n");
       sbScript.Append("<!--\n");
       //需要IE5.5以上支持
       //sbScript.Append("window.showModalDialog('Progress.aspx','','dialogHeight: 100px; dialogWidth: 350px; edge: Raised; center: Yes; help: No; resizable: No; status: No;scroll:No;');\n");
       sbScript.Append("window.open('Progress.aspx','', 'height=100, width=350, toolbar =no, menubar=no, scrollbars=no, resizable=no, location=no, status=no');\n");
       sbScript.Append("// -->\n");
       sbScript.Append("</script>\n");
       Page.RegisterClientScriptBlock("OpenProgressBar", sbScript.ToString());
      }
      private void LongTask()
      {
       //模拟长时间任务
       //每个循环模拟任务进行到不同的阶段
       for(int i=0;i<11;i++)
       {
        System.Threading.Thread.Sleep(1000);
        //设置每个阶段的state值,用来显示当前的进度
        Session["State"] = i+1;
       }
       //任务结束
       Session["State"] = 100;
      }
      private int state = 0;
      private void Page_Load(object sender, System.EventArgs e)
      {
       // Put user code to initialize the page here
       if(Session["State"]!=null)
       {
        state = Convert.ToInt32(Session["State"].ToString());
       }
       else
       {
        Session["State"]=0;
       }
       if(state>0&&state<=10)
       {
        this.lblMessages.Text = "Task undertaking!";
        this.panelProgress.Width = state*30;
        this.lblPercent.Text = state*10 + "%";
        Page.RegisterStartupScript("","<script>window.setTimeout('window.Progress.submit()',100);</script>");
       }
       if(state==100)
       {
        this.panelProgress.Visible = false;
        this.panelBarSide.Visible = false;
        this.lblMessages.Text = "Task Completed!";
        Page.RegisterStartupScript("","<script>window.close();</script>");
       }
      }
     
  • 相关阅读:
    【ML】【HMM】【转】隐马尔可夫模型(HMM)简介
    【ML】对线性回归,logistic回归和广义线性回归的认识
    【CT】【转】 P,NP,NPcomplete,NPhard
    【python】python path,macports,easyinstall,numpy,scipy,ipython,matplotlib,集成工具
    【ML】【转】关于主成分分析的五个问题
    【mat】matlab矩阵运算及函数
    【CT】【转】第一个 NPcomplete 问题
    【ML】VC dimension
    【CT】递归语言的性质
    【CT】Universal Turing Machine
  • 原文地址:https://www.cnblogs.com/guozhe/p/2528297.html
Copyright © 2011-2022 走看看