zoukankan      html  css  js  c++  java
  • C#中 一个多线程框架

    C#提供了丰富的多线程操作,为编程带来了极大的便利,但如果使用不当也会带来各种各样的麻烦。

    这里把C#中多线的操作进行了一下简单的封装,使它对外提供的接口简洁,易于控制。

    保留一下的代码片段,以备日后查用。

    BaseThread基类,线程派生类可以继承这个基类,并且实现自己的Run方法。

      1 using System;
      2 using System.Collections.Generic;
      3 using System.Text;
      4 using System.Threading;
      5  
      6 namespace BaseThread
      7 {
      8     public class BaseThread
      9     {
     10         public enum ThreadStatus
     11         {
     12             CREATED,
     13             RUNNING,
     14             STOPED,
     15         };
     16  
     17         private int m_Tid;
     18         private bool m_IsAlive;
     19         private ThreadStatus m_Status;
     20         private Thread m_WorkingThread;
     21  
     22         private static void WorkFunction(object arg)
     23         {
     24             try
     25             {
     26                 System.Diagnostics.Trace.WriteLine("BaseThread::WorkFunction {");
     27                 ((BaseThread)arg).Run();
     28                 System.Diagnostics.Trace.WriteLine("BaseThread::WorkFunction }");
     29             }
     30             catch (ThreadAbortException abt_ex)
     31             {
     32                 System.Diagnostics.Trace.WriteLine("BaseThread::WorkFunction ThreadAbortException " + abt_ex.ToString());
     33                 Thread.ResetAbort();
     34             }
     35             catch (ThreadInterruptedException int_ex)
     36             {
     37                 System.Diagnostics.Trace.WriteLine("BaseThread::WorkFunction ThreadAbortException " + int_ex.ToString());
     38             }
     39             catch (Exception ex)
     40             {
     41                 System.Diagnostics.Trace.WriteLine("BaseThread::WorkFunction Exception " +ex.ToString());
     42             }
     43             finally
     44             {
     45                 ((BaseThread)arg).Status = ThreadStatus.STOPED;
     46                 m_IsAlive = false;
     47                 m_Tid = -1;
     48             }
     49         }
     50  
     51         public BaseThread()
     52         {
     53             m_WorkingThread = new Thread(WorkFunction);
     54             m_Tid = -1;
     55             m_IsAlive = false;
     56             m_Status = ThreadStatus.CREATED;
     57         }
     58  
     59         public int Start()
     60         {
     61             try
     62             {
     63                 System.Diagnostics.Trace.WriteLine("DLx Framework BaseThread Start() {");
     64                 m_WorkingThread.Start(this);
     65                 m_Tid = m_WorkingThread.ManagedThreadId;
     66                 m_IsAlive = true;
     67                 m_Status = ThreadStatus.RUNNING;
     68  
     69                 System.Diagnostics.Trace.WriteLine("DLx Framework BaseThread Start() }");
     70             }
     71             catch(Exception ex)
     72             {
     73                 System.Diagnostics.Trace.WriteLine("DLx Framework BaseThread Start() Get an exception: " + ex.ToString());
     74                 m_Tid = -1;
     75                 m_IsAlive = false;
     76                 m_Status = ThreadStatus.STOPED;
     77             }
     78             return 0;
     79         }
     80  
     81         public int Stop(int timeout)
     82         {
     83             System.Diagnostics.Trace.WriteLine("DLx Framework BaseThread Stop {");
     84             try
     85             {
     86                 if (m_IsAlive)
     87                 {
     88                     System.Diagnostics.Trace.WriteLine("BaseThread Stop: Thread is alive");
     89                     m_IsAlive = false;
     90  
     91                     if (timeout > 0)
     92                     {
     93                         if (!m_WorkingThread.Join(timeout))
     94                         {
     95                             System.Diagnostics.Trace.WriteLine("BaseThread Stop: Join failed, m_WorkingThread.Abort {");
     96                             m_IsAlive = false;
     97                             m_WorkingThread.Abort();
     98                             System.Diagnostics.Trace.WriteLine("BaseThread Stop: Join failed, m_WorkingThread.Abort }");
     99                         }
    100                     }
    101                     else
    102                     {
    103                         if (!m_WorkingThread.Join(3000))
    104                         {
    105                             System.Diagnostics.Trace.WriteLine("BaseThread Stop: Join Timer default = 3000 failed, m_WorkingThread.Abort {");
    106                             m_IsAlive = false;
    107                             m_WorkingThread.Abort();
    108                             System.Diagnostics.Trace.WriteLine("BaseThread Stop: Join Timer default = 3000 failed, m_WorkingThread.Abort }");
    109                         }
    110                     }
    111                 }
    112                 else
    113                 {
    114                     System.Diagnostics.Trace.WriteLine("BaseThread Stop: Thread is NOT alive");
    115  
    116                     if (m_WorkingThread != null)
    117                     {
    118                         System.Diagnostics.Trace.WriteLine("BaseThread Stop: Thread status is UNUSUAL");
    119                         if (m_WorkingThread.IsAlive)
    120                         {
    121                             System.Diagnostics.Trace.WriteLine("BaseThread Stop: Force to ABOTR ");
    122                             m_WorkingThread.Abort();
    123                         }
    124                     }
    125                 }
    126                 m_WorkingThread = null;
    127             }
    128             catch (Exception ex)
    129             {
    130                 System.Diagnostics.Trace.WriteLine("BaseThread Stop: " + ex.ToString());
    131             }
    132  
    133             System.Diagnostics.Trace.WriteLine("DLx Framework BaseThread Stop }");
    134             return 0;
    135         }
    136         
    137         public int Tid
    138         {
    139             get { return m_Tid; }    
    140         }
    141  
    142         public bool IsAlive
    143         {
    144             get { return m_IsAlive; }
    145         }
    146  
    147         public ThreadStatus Status
    148         {
    149             get { return m_Status; }
    150             set { m_Status = value; }
    151         }
    152  
    153  
    154         public virtual void Run(){}
    155  
    156         ~BaseThread()
    157         {
    158             if (m_WorkingThread != null)
    159             {
    160                 System.Diagnostics.Trace.WriteLine("~BaseThread: Thread status is UNUSUAL");
    161                 if (m_WorkingThread.IsAlive)
    162                 {
    163                     System.Diagnostics.Trace.WriteLine("~BaseThread: Force to ABOTR ");
    164                     m_WorkingThread.Abort();
    165                 }
    166                 m_WorkingThread = null;
    167             }
    168         }
    169     }
    170 }

     

    子类继承 BaseThread,它的Run函数很简单,只是打印数字。

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5  
     6 using DLxFramework;
     7  
     8  
     9 namespace UseThreadBase
    10 {
    11     public class Worker : BaseThread
    12     {
    13         public Worker()
    14         {}
    15  
    16         private int m_i = 0;
    17         public override void Run()
    18         {
    19             while (IsAlive)
    20             {
    21                 Console.WriteLine("Worker : " + m_i++);
    22             }
    23         }
    24  
    25         public int Value
    26         {
    27             get { return m_i; }
    28         }
    29     }
    30 }

     

    Main函数启动和停止工作线程。

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5  
     6 namespace UseThreadBase
     7 {
     8     class Program
     9     {
    10         static void Main(string[] args)
    11         {
    12             Worker work = new Worker();
    13  
    14             work.Start();
    15  
    16             System.Threading.Thread.Sleep(5000);
    17  
    18             work.Stop(2000);
    19  
    20         }
    21     }
    22 }

     

    在整个的例子中,业务处理的工作单元并不需要去关注线程的启动,停止和异常处理等细节。它只需要重载Run函数,并添加自己的工作内容即可。

    BaseThread中实现了对线程的基本控制。

    转载于:https://www.cnblogs.com/neo98/articles/5751226.html

  • 相关阅读:
    js复习(一)
    Webform(文件上传)
    Webform(分页与组合查询配合使用)
    Webform(分页、组合查询)
    webform(内置对象)
    Webform(内置对象-Response与Redirect、QueryString传值、Repeater删改)
    Webform(Repeater控件)
    MDI窗体容器 权限设置
    进程和线程
    WinForm三级联动
  • 原文地址:https://www.cnblogs.com/XuYiHe/p/14714132.html
Copyright © 2011-2022 走看看