AsyncCallback là gì?


79

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:


143

Khi asyncphương thức kết thúc quá trình xử lý, AsyncCallbackphươ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 asyncluồng hoàn thành.

Dưới đây là một số giải thích thêm về Asynccá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 EndReadvà đó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ệnThă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);
}

1
Có cách nào để làm điều này để CompleteRead là một hàm không tĩnh không?
greggorob64

1
Có, bạn có thể tạo cả hai phương thức phiên bản TestCallbackAPM và CompleteRead.
Người dùng SO

32

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'.


4

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:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.