非同步回撥--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("非同步結束。");
}
}
}
複製程式碼