Sự khác biệt giữa sử dụng và chờ đợi sử dụng là gì? Và làm thế nào tôi có thể quyết định sử dụng cái nào?


21

Tôi đã nhận thấy rằng trong một số trường hợp, Visual Studio khuyên bạn nên làm điều này

await using var disposable = new Disposable();
// Do something

thay vì điều này

using var disposable = new Disposable();
// Do something

Sự khác biệt giữa usingvà là await usinggì?

Làm thế nào tôi nên quyết định sử dụng cái nào?


3
Có vẻ như bạn chỉ có thể sử dụng await usingvới một IAsyncDisposablevà bạn chỉ có thể sử dụng usingvới một IDisposablevì không ai được thừa hưởng từ người khác. Thời gian duy nhất bạn có thể sử dụng là nếu lớp cụ thể thực hiện cả hai và sau đó tùy thuộc vào việc bạn có viết mã không đồng bộ hay không.
juharr

Câu trả lời:


31

Đồng bộ hóa cổ điển bằng cách sử dụng

Cổ điển sử dụng gọi Dispose()phương thức của một đối tượng thực hiện IDisposablegiao diện.

using var disposable = new Disposable();
// Do Something...

Tương đương với

IDisposable disposable = new Disposable();
try
{
    // Do Something...
}
finally
{
    disposable.Dispose();
}

Async mới đang chờ sử dụng

Việc chờ đợi mới bằng cách sử dụng các cuộc gọi và chờ đợi DisposeAsync()phương thức của một đối tượng thực hiện IAsyncDisposablegiao diện.

await using var disposable = new AsyncDisposable();
// Do Something...

Tương đương với

IAsyncDisposable disposable = new AsyncDisposable();
try
{
    // Do Something...
}
finally
{
    await disposable.DisposeAsync();
}

Các giao diện IAsyncDisposable được thêm vào .NET Core 3.0.NET Standard 2.1.

Trong .NET, các lớp sở hữu tài nguyên không được quản lý thường triển khai giao diện IDis Dùng để cung cấp cơ chế giải phóng đồng bộ tài nguyên không được quản lý. Tuy nhiên, trong một số trường hợp, họ cần cung cấp một cơ chế không đồng bộ để giải phóng các tài nguyên không được quản lý ngoài (hoặc thay vì) cơ chế đồng bộ . Việc cung cấp một cơ chế như vậy cho phép người tiêu dùng thực hiện các hoạt động xử lý sử dụng nhiều tài nguyên mà không chặn luồng chính của ứng dụng GUI trong một thời gian dài.

Các IAsyncDisposable.DisposeAsync phương pháp của giao diện này trả về một ValueTask đại diện cho hoạt động dispose không đồng bộ. Các lớp sở hữu tài nguyên không được quản lý thực hiện phương thức này và người tiêu dùng của các lớp này gọi phương thức này trên một đối tượng khi không còn cần thiết.

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.