1. Trang chủ
  2. » Công Nghệ Thông Tin

Asynchronous I/O pps

4 210 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 4
Dung lượng 397,21 KB

Nội dung

Biên tập: thienthanit@yahoo.com Nguồn: Internet Thông thường, khi mới làm quen với C#, kiểu nhập xuất bạn dùng là kiểu xuất nhập đồng bộ (synchronous I/O), nghĩa là trong chương trình, bạn đang đọc hoặc viết thì mọi hoạt động khác đều ngưng lại. Phải nói là đọc dữ liệu hoặc viết dữ liệu đòi hỏi thời gian (tương đối) khá dài, đặc biệt khi chỗ lưu trữ lâu dài là đĩa từ hoặc mạng Với những tập tin đồ sộ, hoặc khi đọc/viết thông qua mạng, thì bạn nên chọn hoạt động theo kiểu bất đồng bộ xuất nhập (asynchronous I/O), cho phép bạn bắt đầu cho đọc rồi quay qua làm chuyện khác trong khi CLR lo hoàn thành yêu cầu đọc của bạn. .Net Framework cung cấp asynchronous I/O thông qua các hàm hành sự BeginRead() và BeginWrite() thuộc lớp Stream. Thứ tự hoạt động như sau: bạn cho triệu gọi hàm BeginRead() đối với tập tin của bạn, rồi quay qua làm việc gì đó không dính dáng cho với việc đọc tập tin kể trên, trong khi việc đọc tiếp tục tiến hành trên một thread khác. Khi việc đọc hoàn tất, bạn sẽ được thông báo bởi một hàm hành sự callback. Lúc này bạn có thể xử lý dữ liệu vừa mới được đọc vào, rồi khởi động lại một việc đọc khác, rồi trở qua một việc khác. Ngoài 3 thông số mà bạn dùng trong việc đọc nhị phân (buffer, di số, và bao nhiêu byte phải đọc) BeginRead() còn đòi hỏi một delegate và một tình trạng đối tượng (state object). Delegate là một hàm hành sự callback tùy chọn, nếu được cung cấp sẽ được triệu gọi hàm khi dữ liệu được đọc vào xong. Tình trạng đối tượng cũng là tùy chọn. Trong thí dụ này, ta trao null đối với tình trạng đối tượng. Tình trang đối tượng được giữ trong những biến thành viên của lớp trắc nghiệm. Bạn tự do đưa bất cứ đối tượng nào bạn muốn vào thông số tình trạng và bạn có thể tìm lại nó khi bạn được gọi lại. Điển hình là bạn cất giấu các trị tình trạng mà bạn sẽ cần tìm trở lại. Thông số tình trạng có thể được sử dụng bởi lập trình viên để cầm giữ tình trạng triệu gọi (pause, pending, running,…). Thử chạy từng bước ví dụ dưới đây, bạn sẽ hiểu hơn về asynchronous I/O trong C#, chú ý, các bạn đổi đường dẫn file cho thích hợp. File có dung lượng vừa vừa một tí, đừng dùng file text. Có thể dùng file nhạc mp3 cũng được. Phần giải thích chi tiết về chương trình này sẽ được post lên sớm nhất. 1. using System; 2. using System.Collections.Generic; 3. using System.Linq; 4. using System.Text; 5. using System.IO; // namespace chua Stream 6. namespace AsynchOIDemo 7. { Biên tập: thienthanit@yahoo.com Nguồn: Internet 8. class AsynchIO 9. { 10. private Stream inputStream; 11. private byte[] buffer; // buffer chua du lieu doc vao 12. const int BufferSize = 256; // kich thuoc buffer 13. private AsyncCallback callback; // delegated method 14. 15. // constructor 16. public AsynchIO() 17. { 18. // mo input stream 19. inputStream = File.OpenRead(@"C:\testFile.mp3"); 20. buffer = new byte[BufferSize]; // cap phat buffer 21. // gan callback 22. callback = new AsyncCallback(this.OnCompleteRead); 23. } 24. 25. static void Main(string[] args) 26. { 27. // tao mot the hien AsynchIO de trieu goi ham constructor 28. AsynchIO theApp = new AsynchIO(); 29. theApp.Run(); 30. //Console.ReadLine(); // chi dung khi file co dung luong qua nho 31. } 32. 33. private void Run() 34. { 35. inputStream.BeginRead(buffer, 0, buffer.Length, callback, null); 36. // lam viec gi do khi CLR dang doc vao du lieu 37. for (long i = 0; i < 500000; i++) 38. { 39. if (i % 100 == 0) 40. Console.WriteLine(" i: {0}", i); 41. } 42. } 43. // ham callback 44. private void OnCompleteRead(IAsyncResult asyncResult) Biên tập: thienthanit@yahoo.com Nguồn: Internet 45. { 46. int bytesRead = inputStream.EndRead(asyncResult); 47. // neu co du lieu tao mot string cho hien thi roi bat dau lai 48. if (bytesRead > 0) 49. { 50. String s = Encoding.ASCII.GetString(buffer, 0, bytesRead); 51. Console.WriteLine(s); 52. inputStream.BeginRead(buffer, 0, buffer.Length, callback, null); 53. } 54. } 55. } 56. } 1. using System; 2. using System.Collections.Generic; 3. using System.Linq; 4. using System.Text; 5. using System.IO; // namespace chua Stream 6. 7. namespace AsynchOIDemo 8. { 9. class AsynchIO 10. { 11. private Stream inputStream; 12. private byte[] buffer; // buffer chua du lieu doc vao 13. const int BufferSize = 256; // kich thuoc buffer 14. private AsyncCallback callback; // delegated method 15. 16. // constructor 17. public AsynchIO() 18. { 19. // mo input stream 20. inputStream = File.OpenRead(@"C:\testFile.mp3"); 21. buffer = new byte[BufferSize]; // cap phat buffer 22. // gan callback 23. callback = new AsyncCallback(this.OnCompleteRead); 24. } Biên tập: thienthanit@yahoo.com Nguồn: Internet 25. 26. static void Main(string[] args) 27. { 28. // tao mot the hien AsynchIO de trieu goi ham constructor 29. AsynchIO theApp = new AsynchIO(); 30. theApp.Run(); 31. //Console.ReadLine(); // chi dung khi file co dung luong qua nho 32. } 33. 34. private void Run() 35. { 36. inputStream.BeginRead(buffer, 0, buffer.Length, callback, null); 37. // lam viec gi do khi CLR dang doc vao du lieu 38. for (long i = 0; i < 500000; i++) 39. { 40. if (i % 100 == 0) 41. Console.WriteLine(" i: {0}", i); 42. } 43. } 44. 45. // ham callback 46. private void OnCompleteRead(IAsyncResult asyncResult) 47. { 48. int bytesRead = inputStream.EndRead(asyncResult); 49. // neu co du lieu tao mot string cho hien thi roi bat dau lai 50. if (bytesRead > 0) 51. { 52. String s = Encoding.ASCII.GetString(buffer, 0, bytesRead); 53. Console.WriteLine(s); 54. inputStream.BeginRead(buffer, 0, buffer.Length, callback, null); 55. } 56. } 57. } 58. } . bộ xuất nhập (asynchronous I/O) , cho phép bạn bắt đầu cho đọc rồi quay qua làm chuyện khác trong khi CLR lo hoàn thành yêu cầu đọc của bạn. .Net Framework cung cấp asynchronous I/O thông qua. gọi (pause, pending, running,…). Thử chạy từng bước ví dụ dưới đây, bạn sẽ hiểu hơn về asynchronous I/O trong C#, chú ý, các bạn đổi đường dẫn file cho thích hợp. File có dung lượng vừa vừa. thường, khi mới làm quen với C#, kiểu nhập xuất bạn dùng là kiểu xuất nhập đồng bộ (synchronous I/O) , nghĩa là trong chương trình, bạn đang đọc hoặc viết thì mọi hoạt động khác đều ngưng lại.

Ngày đăng: 12/07/2014, 19:20

TỪ KHÓA LIÊN QUAN