zoukankan      html  css  js  c++  java
  • 多线程 异步 beginInvoke EndInvoke 使用

      有许多耗时操作时,还要响应用户操作。这时候就需要用其他线程或者异步来搞。本来是改造公司的日志组件。因为多上了个国外大区的业务到来本系统来。这个系统其他地方都好就是日志,动不动就要死给我们看。有时候寻找业务流程时缺失了一块日志,令人欲仙欲死。刚好年末了没什么业务上线,决定改造日志。前人栽树后人心凉。本着我不入地狱谁入地狱的精神,折腾完了这个日志。发现线程的有些地方处理的不好。顺带给自己留个念想谢谢异步或者多线程的东西。有错误欢迎指正。

      beginInvoke EndInvoke 使用

     

    1. 使用历史

      这两个是以前好早就有的,在.net框架内用的比较广泛,比如引用webservice时,除了自动生成同步的方法,还会生成异步调用的方法。

    随着.net版本的不同有直接封装成 beginXXXX 和endXXXX的,使用时直接begin,然后处理一些事情,然后再end.不过有个缺点就是固定的方法太死。

    后来webservice就封装了下,弄个complete后缀的委托,来事件通知调用结束了。然后调用方法直接是AsycXXXX。跟自己写控件时往上层抛事件差不多。

    还有就是IO和网络编程的一些类实现这个,比如NetworkStream 中的读和写都有同步和异步的方法。

    2.使用方式

      对于这两个使用方式如果使用,可以直接在一个方法内begin end在他们之间搞些事情。不过这样太死板了。一般是给个委托操作。

    看如下代码:

    public delegate bool deofdosomething(object param);
            public void invoketest()
            {
                Console.WriteLine("star..");
                //耗时操作的传递参数
                object dosomeparam = "1";
                //耗时方法执行结束,回调函数可以得到的参数
                object endinvokeparam = "2";
                deofdosomething de = new deofdosomething(dosomething);
                AsyncCallback acb = new AsyncCallback(invokecallback);
                IAsyncResult iar = de.BeginInvoke(dosomeparam, acb, endinvokeparam);
                if (iar.AsyncWaitHandle.WaitOne(1000))
                {
                    Console.WriteLine("not time out");
                }
                else
                {
                    Console.WriteLine("time out");
                }
            }
    
            private bool dosomething(object obj)
            {
                //耗时操作
                Thread.Sleep(2000);
                //dosomeparam
                Console.WriteLine(obj.ToString());
                return true;
            }
    AsyncCallback 是.net框架内一个特殊的委托,在异步调用后如果已经执行完成,可以通过这个委托来通知。当然也可用传入null。代表不根据结果操作什么。

    iar.AsyncWaitHandle.WaitOne 这个是begin后的语句句柄,可以用来设定是否等待异步超时。跟autoresetevent一样设置超过超时时间立马返回。怀疑里面就是用的这玩意实现的。
    会返回个布尔类型的值,如果没有超时这个值是TRUE,如果超时了这个值是FALSE。
    
    
            private void invokecallback(IAsyncResult iar)
            {
                deofdosomething de = (deofdosomething)((AsyncResult)iar).AsyncDelegate;
                //endinvokeparam
                string targeparam = ((AsyncResult)iar).AsyncState.ToString();
                Console.WriteLine(targeparam);
                //dosomething  有返回值
                bool issuccess = de.EndInvoke(iar);
                Console.WriteLine("end");
            }
    IAsyncResult  是异步操作完成的委托传过来执行的方法。作为一个接口可以直接转成 AsyncResult ,它的AsyncDelegate 是可以获取到引用它的委托。

    AsyncState 是个object类型的参数,是从begin传来的参数,因为异步操作可以带来一些额外的信息。

    一下是测试结果。有人来闹我,等改天再写吧。预计写threadpool还有task两个。希望能坚持。

    
    
  • 相关阅读:
    【InfoPath2007】The form has been closed
    深入浅出Nintex——调用子流程
    深入浅出Nintex——使用查询XML动作
    深入浅出Nintex——使用Call WebService来查询Item ID
    深入浅出Nintex——获得某群组的用户集合
    深入浅出SharePoint2007——Webpart开发
    深入浅出Nintex——获得指定用户的角色
    深入浅出Nintex——使用构建动态字符串动作
    Lucene.net 实现全文搜索
    DotLucene源码浅读笔记(1)补遗:编写简单中文分词器ChineseAnalyzer
  • 原文地址:https://www.cnblogs.com/qiaqia-liu/p/6234983.html
Copyright © 2011-2022 走看看