사용과 사용 대기의 차이점은 무엇입니까? 어떤 것을 사용할지 어떻게 결정할 수 있습니까?


21

경우에 따라 Visual Studio 에서이 작업을 수행하는 것이 좋습니다.

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

이 대신

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

차이점은 무엇이며 using그리고 await using?

사용할 것을 어떻게 결정해야합니까?


3
만 사용할 수있는 것 같습니다 await using로모그래퍼 IAsyncDisposable하고 만 사용할 수 있습니다 usingIDisposable다른에서 어느 하나를 상속하기 때문이다. 둘 중 하나를 사용할 수있는 유일한 시간은 구체적 클래스가 두 가지를 모두 구현하고 비동기 코드를 작성하는지 여부에 달려 있습니다.
juharr

답변:


31

사용하여 클래식 동기화

클래식 사용 Dispose()IDisposable인터페이스를 구현하는 객체 의 메소드 를 호출합니다 .

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

에 해당

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

새로운 비동기는 사용을 기다립니다

새로운 것은 호출을 사용하여 대기 DisposeAsync()하고 IAsyncDisposable인터페이스를 구현하는 객체 의 메소드를 기다 립니다.

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

에 해당

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

IAsyncDisposable 인터페이스 에 추가되었습니다 .NET Core 3.0하고 .NET Standard 2.1.

.NET에서 관리되지 않는 리소스를 소유 한 클래스는 일반적으로 IDisposable 인터페이스를 구현하여 관리되지 않는 리소스를 동 기적으로 해제하는 메커니즘을 제공합니다. 그러나 경우에 따라 동기식 리소스 외에 (또는 대신) 관리되지 않는 리소스를 해제하기위한 비동기식 메커니즘제공 해야합니다 . 이러한 메커니즘을 제공하면 소비자는 GUI 응용 프로그램의 메인 스레드를 오랫동안 차단하지 않고도 리소스 집약적 처분 작업을 수행 할 수 있습니다.

이 인터페이스 의 IAsyncDisposable.DisposeAsync 메서드 는 비동기 처리 작업을 나타내는 ValueTask 를 반환 합니다. 관리되지 않는 리소스를 소유 한 클래스는이 메서드를 구현하며 이러한 클래스의 소비자는 더 이상 필요하지 않은 개체에서이 메서드를 호출합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.