思想决定人生,态度改变一切

成功者找方法,失败者找借口! 做事先做人;安分做人,本分做事!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
改编自网上的一个例子程序。
异步调用的基础知识。
更复杂的应用还在研究中。
复制  保存
public class MyAsync
{
public delegate string LengthyProcedureAsyncStub(int milliseconds);
public string LengthyProcedure(int milliseconds)
{
System.Threading.Thread.Sleep(milliseconds);//测试,让当前线程中止一段时间。
        return "成功";
}
/// <summary>
    /// 让别人来异步调用的开始
    /// </summary>
    /// <param name="milliseconds">原来函数的参数</param>
    /// <param name="callback">
    /// 希望得到回调的函数。必须是声明为被异步调用的函数
    /// 比如AsyncCallback callback = new AsyncCallback(GetResult);
    /// 而GetResult函数应该是这样的private void GetResult(IAsyncResult ar)
    /// 他会如此使用:xxx.Endxxx()
    /// </param>
    /// <param name="s">
    /// 为了处理用户的数据结构。
    /// 不是必须的。也可以没有
    /// </param>
    /// <returns></returns>
    public IAsyncResult BeginLengthyProcedure(int milliseconds, AsyncCallback callback)
{
//让别人来异步调用的开始
        LengthyProcedureAsyncStub stub = new LengthyProcedureAsyncStub(LengthyProcedure);
//开始执行委托:BeginInvoke。仅仅是开始执行。然后就返回。
        //这里只是借助委托的异步处理机制来完成。
        //3部分参数:函数本身的参数;callback异步函数;函数本身的委托
        IAsyncResult result = stub.BeginInvoke(milliseconds, callback, stub);
//返回IAsyncResult
        return result;
}
/// <summary>
    /// 因为callback被注册到了委托的异步处理中,
    /// 所以当这个委托被处处理之后,就会回调callback函数。
    /// 这时候,那个callback就可以如此使用结果了:
    /// result=xxx.Endxxx();
    /// 这里就是那个Endxxx。
    /// 这里就是提供result的函数
    /// </summary>
    /// <param name="result">异步结果</param>
    /// <returns>这里的返回值是函数本身的返回值</returns>
    public string EndLengthyProcedure(IAsyncResult result)
{
//这里只是提供结果。
        //从result中取出自己传进去的参数:委托。然后使用这个委托的endinvoke方法来获取结果
        LengthyProcedureAsyncStub stub = (LengthyProcedureAsyncStub) result.AsyncState;
string res = stub.EndInvoke(result);
return res;
}
}


原文出处:http://www.chenjiliang.com/Article/View.aspx?ArticleID=2294&TypeID=98
posted on 2008-01-13 21:29  投石问路  阅读(891)  评论(0编辑  收藏  举报