.NET中的非同步作業

來源:互聯網
上載者:User

.NET Framework 為非同步作業提供兩種設計模式:

  1. 使用 IAsyncResult 對象的非同步作業。
  2. 使用事件的非同步作業。

這裡我分別給出一個簡單的例子,以供參考。

1。使用 IAsyncResult 對象的非同步作業。

using System;
using System.Collections.Generic;
using System.Text;

using System.Threading;

namespace ConsoleApplication1
{

    class Program
    {
        static
void Main(string[] args)
        {
            Console.WriteLine(DateTime.Now);
            AsyncOpTest op = new AsyncOpTest();
            GetTimeHandler handler = op.DelayGetTime;
            handler.BeginInvoke(6, GetTimeCallBack, handler);
            Console.WriteLine("function return");

            Thread.Sleep(-1); //等待非同步作業結束

        }

        static
void GetTimeCallBack(IAsyncResult ar)
        {
            GetTimeHandler handler = ar.AsyncState as GetTimeHandler;
            DateTime time = handler.EndInvoke(ar); //擷取時間

            Console.WriteLine(time);
            Console.WriteLine("function end");
        }
    }

    delegate DateTime GetTimeHandler(int seconds);
    class AsyncOpTest
    {
        public DateTime DelayGetTime(int seconds) //使用同步方式擷取時間
        {
            Thread.Sleep(seconds * 1000);
            return DateTime.Now;
        }
    }
}

2。使用事件的非同步作業。

using System;
using System.Collections.Generic;
using System.Text;

using System.Threading;

namespace ConsoleApplication1
{

    class Program
    {
        static
void Main(string[] args)
        {
            Console.WriteLine(DateTime.Now);
            AsyncOpTest op = new AsyncOpTest();
            op.GetTimeCompleted += GetTimeCompleted;
            op.DelayGetTimeAsync(6);
            Console.WriteLine("function return");

            Thread.Sleep(-1); //等待非同步作業結束

        }

        static
void GetTimeCompleted(object sender, GetTimeCompletedEventArgs e)
        {
            Console.WriteLine(e.Time);
            Console.WriteLine("function end");
        }
    }

    class GetTimeCompletedEventArgs : EventArgs
    {
        public GetTimeCompletedEventArgs(DateTime time)
        {
            this.time = time;
        }

        private DateTime time;
        public DateTime Time
        {
            get { return time; }
        }

    }
    class AsyncOpTest
    {
        public
event EventHandler<GetTimeCompletedEventArgs> GetTimeCompleted;

        public DateTime DelayGetTime(int seconds) //使用同步方式擷取時間
        {
            Thread.Sleep(seconds * 1000);
            return DateTime.Now;
        }

        delegate DateTime GetTimeHandler(int seconds);
        public
void DelayGetTimeAsync(int seconds) //使用非同步方式延遲擷取時間
        {
            GetTimeHandler calu = DelayGetTime;
            calu.BeginInvoke(seconds, CaluCallBack, calu);
        }

        void CaluCallBack(IAsyncResult ar)
        {
            GetTimeHandler calu = ar.AsyncState as GetTimeHandler;
            DateTime time = calu.EndInvoke(ar); //擷取函數傳回值
            if (GetTimeCompleted != null)
            {
                GetTimeCompleted(this, new GetTimeCompletedEventArgs(time));
            }
        }
    }
}

當然,這個程式不是很完善,需要解決的問題還很多(如多線程並發訪問等)。但也能基本的示範基於事件的非同步作業的實現過程。

3。小結

比較而言,通過 IAsyncResult 對象實現非同步作業相對簡單,並且功能強大,但使用控制起來相對較麻煩,代碼不是很優雅,使用者需要對IasyncResult的使用方式有一定的瞭解。使用事件的非同步作業相對簡單得多,基本上看到API的聲明就能用,而實現起來相對較為複雜,並且功能有限。

更多相關內容,請參看msdn非同步編程設計模式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.