異步回調--BeginInvoke方法


開始和結束異步操作(xxx表示同步方法的名詞):Beginxxx和Endxxx

例如:FileStream類的對象的BeginRead()和EndRead()

BeginRead()方法返回一個IAsyncResult對象,表示異步操作的狀態。如果喜歡阻塞當前線程並等待讀取完成,那么可以調用EndRead()方法,並將IAsyncResult對象作為參數傳遞給該方法。

BeginRead()方法實際就是啟動一個新線程來進行異步讀取,而EndRead()方法相當與調用了異步線程的Join方法。

demo1:創建10個異步線程,每個線程負責讀取10個字節到緩沖區中,而回調方法GetPosition在每個線程結束后都會被調用

復制代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.IO;

namespace AsyncCallback
{
class Program
{
static void Main(string[] args)
{
using (FileStream fs = new FileStream(@"F:\123.txt", FileMode.Open, FileAccess.Read))
{
byte[] bs = new byte[1000];
for (int i = 0; i < 10; i++)
{
fs.BeginRead(bs, i * 100, 100, GetPosition, fs);
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++)
{
sb.Append((char)i);
}
Console.ReadKey();
}

    }

    static void GetPosition(IAsyncResult iar)
    {
        FileStream fs = (FileStream)iar.AsyncState;
        Console.WriteLine("本次讀取文件文職:{0}",fs.Position);
        fs.EndRead(iar);
    }
}

}
復制代碼

demo2:delegate委托的BeginInvoke、EndInvoke、AsyncCallback用法

復制代碼
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Threading;

namespace BeginInvoke
{
class Program
{
static void Main(string[] args)
{
NewTaskDelegate task = NewTask;
//int n = task(2000);

        //AsyncCallback方法一
        //AsyncCallback callback = new AsyncCallback(MyAsyncCallback);
        //IAsyncResult asyncResult = task.BeginInvoke(2000, callback, task);

        //AsyncCallback方法二
        IAsyncResult asyncResult = task.BeginInvoke(2000, MyAsyncCallback, task);

        //int result = task.EndInvoke(asyncResult);
        //Console.WriteLine(result);

        Console.ReadKey();
    }

    public delegate int NewTaskDelegate(int ms);

    private static int NewTask(int ms)
    {
        Console.WriteLine("任務開始");
        Thread.Sleep(ms);
        Random r = new Random();
        int n = r.Next(10000);
        Console.WriteLine("任務完成");
        return n;
    }

    private static void MyAsyncCallback(IAsyncResult iar)
    {
        NewTaskDelegate task = (NewTaskDelegate)iar.AsyncState;
        int n = task.EndInvoke(iar);
        Console.WriteLine(n); 
        Console.WriteLine("異步結束。");      
    }
}

}
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM