Việc sử dụng AsyncCallback là gì và tại sao chúng ta nên sử dụng nó?
Câu trả lời:
Khi async
phương thức kết thúc quá trình xử lý, AsyncCallback
phương thức sẽ tự động được gọi, nơi các câu lệnh xử lý sau có thể được thực thi. Với kỹ thuật này, bạn không cần phải thăm dò ý kiến hoặc đợi async
luồng hoàn thành.
Dưới đây là một số giải thích thêm về Async
cách sử dụng Gọi lại:
Mô hình gọi lại: Mô hình gọi lại yêu cầu chúng ta chỉ định một phương thức để gọi lại và bao gồm bất kỳ trạng thái nào mà chúng ta cần trong phương thức gọi lại để hoàn thành cuộc gọi. Có thể thấy mô hình gọi lại trong ví dụ sau:
static byte[] buffer = new byte[100];
static void TestCallbackAPM()
{
string filename = System.IO.Path.Combine (System.Environment.CurrentDirectory, "mfc71.pdb");
FileStream strm = new FileStream(filename,
FileMode.Open, FileAccess.Read, FileShare.Read, 1024,
FileOptions.Asynchronous);
// Make the asynchronous call
IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length,
new AsyncCallback(CompleteRead), strm);
}
Trong mô hình này, chúng tôi đang tạo một AsyncCallback
đại biểu mới , chỉ định một phương thức để gọi (trên một luồng khác) khi hoạt động hoàn tất. Ngoài ra, chúng tôi đang chỉ định một số đối tượng mà chúng tôi có thể cần làm trạng thái của cuộc gọi. Đối với ví dụ này, chúng tôi đang gửi đối tượng luồng vào vì chúng tôi sẽ cần gọi EndRead
và đóng luồng.
Phương thức mà chúng ta tạo để được gọi vào cuối cuộc gọi sẽ trông giống như sau:
static void CompleteRead(IAsyncResult result)
{
Console.WriteLine("Read Completed");
FileStream strm = (FileStream) result.AsyncState;
// Finished, so we can call EndRead and it will return without blocking
int numBytes = strm.EndRead(result);
// Don't forget to close the stream
strm.Close();
Console.WriteLine("Read {0} Bytes", numBytes);
Console.WriteLine(BitConverter.ToString(buffer));
}
Các kỹ thuật khác là Chờ cho đến khi thực hiện và Thăm dò ý kiến .
Mô hình Wait-Until-Done Mô hình chờ cho đến khi hoàn thành cho phép bạn bắt đầu cuộc gọi không đồng bộ và thực hiện công việc khác. Khi công việc khác hoàn tất, bạn có thể cố gắng kết thúc cuộc gọi và nó sẽ chặn cho đến khi hoàn tất cuộc gọi không đồng bộ.
// Make the asynchronous call
strm.Read(buffer, 0, buffer.Length);
IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null);
// Do some work here while you wait
// Calling EndRead will block until the Async work is complete
int numBytes = strm.EndRead(result);
Hoặc bạn có thể sử dụng tay cầm chờ.
result.AsyncWaitHandle.WaitOne();
Mô hình thăm dò Phương pháp thăm dò tương tự, ngoại trừ mã sẽ thăm dò ý kiến IAsyncResult
để xem liệu nó đã hoàn thành hay chưa.
// Make the asynchronous call
IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null);
// Poll testing to see if complete
while (!result.IsCompleted)
{
// Do more work here if the call isn't complete
Thread.Sleep(100);
}
Nghĩ theo cách này. Bạn có một số hoạt động mà bạn muốn thực hiện song song. Bạn sẽ kích hoạt điều này bằng cách sử dụng các chuỗi thực thi không đồng bộ. Đây là một cơ chế cháy và quên.
Nhưng một số tình huống yêu cầu một cơ chế mà bạn có thể bắn và quên nhưng cần thông báo khi hoạt động hoàn tất. Đối với điều này, bạn sẽ sử dụng một lệnh gọi lại không đồng bộ.
Thao tác không đồng bộ nhưng sẽ gọi lại cho bạn khi thao tác hoàn tất. Ưu điểm của việc này là bạn không phải đợi thao tác cho đến khi nó hoàn thành. Bạn có thể tự do thực hiện các thao tác khác và do đó luồng của bạn không bị chặn.
Ví dụ về điều này sẽ là chuyển nền của một tệp lớn. Trong khi quá trình chuyển đang diễn ra, bạn không thực sự muốn chặn người dùng thực hiện các thao tác khác. Khi quá trình chuyển hoàn tất, quá trình sẽ gọi lại cho bạn về phương thức không đồng bộ, nơi bạn có thể bật lên một hộp thông báo có nội dung 'Chuyển hoàn tất'.
AsyncCallbacks được sử dụng để chỉ định một hàm để gọi khi một hoạt động không đồng bộ hoàn thành. Ví dụ: nếu bạn đang thực hiện một hoạt động IO, bạn sẽ gọi BeginRead trên một luồng và chuyển vào một đại biểu AsyncCAllback. Hàm sẽ được gọi khi hoàn thành thao tác đọc.
Để biết thêm thông tin, hãy xem: