zoukankan      html  css  js  c++  java
  • 关于异步事件的一个测试及其分析结果

    因为工作中需要在多线程中使用事件,本来想在事件中抛出一个异常到主程序中,结果可想而知,失败了。于是作了如下的一个测试,看看多线程中的异常处理问题,代码如下:

    using System;
    using System.Runtime.InteropServices;
    using System.Threading;

    namespace testAsyncEvent
    {
        
    /// <summary>
        
    /// Class1 的摘要说明。
        
    /// </summary>

        class Class1
        
    {
            
    /// <summary>
            
    /// 应用程序的主入口点。
            
    /// </summary>

            [STAThread]
            
    static void Main(string[] args)
            
    {
                Class1 c 
    = new Class1();
                Thread t 
    = new Thread(new ThreadStart(c.Run));
                t.Name 
    = "root";
                t.Start();
            }


            
    public void Run()
            
    {
                EventRaiser er0 
    = new EventRaiser("er0");
                er0.AsyncTextChanged 
    += new TextEvent(er0_TextChanged);
                er0.SyncTextChanged 
    += new TextEvent(er0_TextChanged);

                Console.Out.WriteLine(
    "Begin");
                ThreadStart ts 
    = new ThreadStart(er0.Run);
                Thread thr 
    = new Thread(ts);
                thr.Name 
    = "child";
                thr.Start();
                Console.Out.WriteLine(
    "Thread Started");

                
    for(int i = 0; i < 10++i)
                
    {
                    Thread.Sleep(
    20);
                    Console.Out.WriteLine(Thread.CurrentThread.Name 
    + ": Cycle Print");
                }


                
    if( thr.IsAlive )
                    thr.Join();
                    
                Console.Out.WriteLine(
    "Ok");
                Console.Out.WriteLine(
    "Press Enter to Exit ");
                Console.In.ReadLine();
            }


            
    private void er0_TextChanged(string id, string text)
            
    {
                Console.Out.WriteLine(Thread.CurrentThread.Name 
    + "(" + id + "):\t" + text);
            }

        }



        
    public delegate void TextEvent(string id, string text);

        
    class EventRaiser
        
    {
            
    const int CYCLES = 3;
            
    public event TextEvent AsyncTextChanged;
            
    public event TextEvent SyncTextChanged;

            
    string _id;
            
    private int count = 0;

            
    public EventRaiser(string id)
            
    {
                _id 
    = id;
            }


            
    public void Run()
            
    {
                RaiseText(
    "Enter Thread:" + Thread.CurrentThread.Name);
                
    for(int i = 0; i < CYCLES; ++i)
                
    {
                    Thread.Sleep(
    10);
                    RaiseEvent();
                }


                
    for(int i = 0; i < CYCLES; ++i)
                
    {
                    RaiseEvent();
                }


                
    for(int i = 0; i < CYCLES; ++i)
                
    {
                    Thread.Sleep(
    10);
                    RaiseEvent();
                }

                RaiseText(
    "Exit Thread:" + Thread.CurrentThread.Name);
            }


            
    void RaiseText(string text)
            
    {
                AsyncTextChanged.BeginInvoke(_id, text, 
    nullnull);
                SyncTextChanged(_id, text);
            }


            
    void RaiseEvent()
            
    {
                RaiseText(count
    ++.ToString());
            }

        }


    }


    代码的执行结果如下:
    Begin
    Thread Started
    root: Cycle Print
    child(er0):     Enter Thread:child
    (er0):  Enter Thread:child
    root: Cycle Print
    child(er0):     0
    (er0):  0
    (er0):  1
    child(er0):     1
    root: Cycle Print
    (er0):  2
    child(er0):     2
    (er0):  3
    child(er0):     3
    (er0):  4
    child(er0):     4
    (er0):  5
    child(er0):     5
    (er0):  6
    child(er0):     6
    root: Cycle Print
    (er0):  7
    child(er0):     7
    (er0):  8
    child(er0):     8
    (er0):  Exit Thread:child
    child(er0):     Exit Thread:child
    root: Cycle Print
    root: Cycle Print
    root: Cycle Print
    root: Cycle Print
    root: Cycle Print
    root: Cycle Print
    Ok
    Press Enter to Exit ...

    从结果分析,发现如果在线程中发生同步事件,则事件的发生源在同一个线程中,如果线程中发生异步事件,则该事件既不在主线程中,也不再子线程中,而是在系统的临时线程中。

    但是这里有一个问题,我无法区分线程的真正不同,哪里可以取得线程号阿?谁能告诉我,这样有线程号的区别,这个例子可以更清楚一些。

  • 相关阅读:
    极域电子教室 e-Learning Class V4 2010专业版 学生机 卸载方法
    浅谈IT员工管理
    apacheserver下载、安装、配置
    Android BLE开发之Android手机搜索iBeacon基站
    Qt编程18:Qt调色板QPalette的使用
    二叉树的操作
    Android应用开发多语言drawable目录
    Mybatis文档阅读笔记(明日继续更新...)
    《Spark快速大数据分析》—— 第六章 Spark编程进阶
    Java程序员的日常——SpringMVC+Mybatis开发流程、推荐系统
  • 原文地址:https://www.cnblogs.com/BigTall/p/79348.html
Copyright © 2011-2022 走看看