비동기 콜백 -- BeginInvoke 메서드

2569 단어
비동기 작업 시작 및 종료(xxx는 동기화 방법의 명사): Beginxxx 및 Endxx
예: 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(" 。");      
    }
}

}

좋은 웹페이지 즐겨찾기