簡體   English   中英

異步編程設計模式

[英]Asynchronous programming design pattern

我正在為 CF.NET 開發一個小技術框架,我的問題是,我應該如何編寫異步部分的代碼? 在 MSDN 上閱讀了很多東西,但對我來說並不清楚。

所以,這里是代碼:

public class A
{
    public IAsyncResult BeginExecute(AsyncCallback callback)
    {
        // What should I put here ?
    }

    public void EndExecute()
    {
        // What should I put here ?
    }

    public void Execute()
    {
        Thread.Sleep(1000 * 10);
    }
}

如果有人可以幫助我...

謝謝 !

您可以使用委托:

public class A
{
    public void Execute()
    {
        Thread.Sleep(1000 * 3);
    }
}

class Program
{
    static void Main()
    {
        var a = new A();
        Action del = (() => a.Execute());
        var result = del.BeginInvoke(state =>
        {
            ((Action)state.AsyncState).EndInvoke(state);
            Console.WriteLine("finished");
        }, del);
        Console.ReadLine();
    }
}

更新:

根據評論部分的要求,這是一個示例實現:

public class A
{
    private Action _delegate;
    private AutoResetEvent _asyncActiveEvent;

    public IAsyncResult BeginExecute(AsyncCallback callback, object state)
    {
        _delegate = () => Execute();
        if (_asyncActiveEvent == null)
        {
            bool flag = false;
            try
            {
                Monitor.Enter(this, ref flag);
                if (_asyncActiveEvent == null)
                {
                    _asyncActiveEvent = new AutoResetEvent(true);
                }
            }
            finally
            {
                if (flag)
                {
                    Monitor.Exit(this);
                }
            }
        }
        _asyncActiveEvent.WaitOne();
        return _delegate.BeginInvoke(callback, state);
    }

    public void EndExecute(IAsyncResult result)
    {
        try
        {
            _delegate.EndInvoke(result);
        }
        finally
        {
            _delegate = null;
            _asyncActiveEvent.Set();
        }
    }

    private void Execute()
    {
        Thread.Sleep(1000 * 3);
    }
}

class Program
{
    static void Main()
    {
        A a = new A();
        a.BeginExecute(state =>
        {
            Console.WriteLine("finished");
            ((A)state.AsyncState).EndExecute(state);
        }, a);
        Console.ReadLine();
    }
}

你不需要做任何特別的事情,因為調用者應該叫你異步方法,

他定義了一個指向您方法的新委托,並使用 .net 異步調用您的方法。

在 BeginExecute 上,您必須啟動異步操作(可能在單獨的線程中開始執行)並盡快返回。 Execute 必須在所有操作結束時調用 AsyncCallback,以便使用異步操作的人知道並獲得結果。 EndExecute 必須停止先前啟動的異步操作(可能會中斷 BeginExecute 啟動的線程)。
沒有更多細節,這是我能做的最好的。

如果你想異步運行一段代碼,你應該使用 BackgroundWorker。 當然,除非您調用的代碼本身不支持異步操作。 就像讀/寫方法或服務調用一樣。

如果要通知異步操作已完成,請使用委托或事件回調。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM