asp.net中BeginInvoke和EndInvoke方法使用方法

來源:互聯網
上載者:User

BeginInvoke和EndInvoke的作用是把一個同步方法改成非同步執行,改造過程主要有3步:

·增加一個與方法對應的委託;
·增加一個AsyncCallback委託類型的回呼函數(在函數體調用EndInvoke擷取傳回值);
·將方法的參數、回呼函數和委託變數傳給BeginInvoke;

下面是一個簡單的樣本:

 代碼如下 複製代碼


public class Test
{
    /// <summary>
    /// 原始方法
    /// </summary>
    /// <returns></returns>
    private int Todo()
    {
        return 100;
    }

    /// <summary>
    /// 增加方法對應的委託
    /// </summary>
    /// <returns></returns>
    delegate int TodoHandler();

    /// <summary>
    /// 增加AsyncCallback委託類型的回呼函數
    /// </summary>
    /// <param name="ar"></param>
    private void TodoCallback(IAsyncResult ar)
    {
        TodoHandler handler = (TodoHandler)ar.AsyncState;
        Console.WriteLine(handler.EndInvoke(ar));
    }

    /// <summary>
    /// 調用樣本
    /// </summary>
    public void InvokeTest()
    {
        TodoHandler handler = new TodoHandler(Todo);
        handler.BeginInvoke(TodoCallback, handler);
    }       
}

參考很多類非同步方法呼叫命名方式BeginXXX和EndXXX,對上面類稍做修改:

 代碼如下 複製代碼


public class Test
{
    public int Todo(int a, int b)
    {
        return a + b;
    }

    private delegate int TodoHandler(int a, int b);
    private TodoHandler _todo = null;

    public Test()
    {
        _todo = Todo;
    }

    public IAsyncResult BeginTodo(int a, int b, AsyncCallback callback, object state)
    {
        return _todo.BeginInvoke(a, b, callback, state);
    }

    public int EndTodo(IAsyncResult ar)
    {
        return _todo.EndInvoke(ar);
    }
}

public class Program
{
    static void TodoCallback(IAsyncResult ar)
    {
        Test test = (Test)ar.AsyncState;
        Console.WriteLine(test.EndTodo(ar));
    }

    static public void Main(string[] args)
    {
        Test test = new Test();
        test.BeginTodo(2, 3, TodoCallback, test);

        Console.ReadKey();
    }
}

BeginTodo方法傳回型別為IAsyncResult,網上看到有人這麼調用:

 代碼如下 複製代碼


static public void Main(string[] args)
{
    Test test = new Test();
    IAsyncResult result = test.BeginTodo(2, 3, null, null);
    Console.WriteLine(test.EndTodo(result));

    Console.ReadKey();
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.