Async/Await 메소드의 반환 값 : 작업 또는 무효?
비동기 프로그래밍에서 async
메소드의 반환 값이 task
void 가 큰 영향을 미칩니다. 이 기사는 각 옵션이 적용되는 시나리오를 살펴 봅니다.
return task
일반적으로 async 메소드는
task 를 반환해야합니다. 이를 통해 코드
는 가 호출되고 필요한 경우 진행 상황을 추적 할 수 있습니다. 이 규칙의 주요 예외는 이벤트를 처리 할 때와 같은
void 반환 유형이 명시 적으로 필요할 때입니다.
return void
void return type의
메소드를 사용하여 "최상위 비동기 조작"으로 태그. 이러한 작업은 예외가 발생할 때 다르게 행동합니다. 반환 값의 작업
와 달리 void
비동기 메소드의 예외는 기본적으로 관찰되지 않습니다. 그것들은 처리되지 않은 예외가되어 taskscheduler.unobservedtaskexception
핸들러를 트리거 할 수 있습니다.
다음 예를 고려하십시오 :
public static async void AsyncMethod2 (int num) { await task.factory.startnew (() => thread.sleep (num)); }
public static async void AsyncMethod2(int num)
{
await Task.Factory.StartNew(() => Thread.Sleep(num));
}
async 및 는 예외를 명시 적으로 처리 할 필요가 없기 때문에
키워드가 불필요합니다. 그러나 예외가 발생하면 관찰되지 않으며 올바르게 처리되지 않을 수 있습니다.
]
task void 비동기 메소드 간의 예외 처리 차이를 보여주기 위해 다음 코드를 고려하십시오.
정적 Async void f ()
{
h ()를 기다립니다.
}
정적 비동기 작업 g ()
{
h ()를 기다립니다.
}
정적 비동기 작업 h ()
{
새로운 NotimplementedException ()을 던지십시오.
}
static async void f()
{
await h();
}
static async Task g()
{
await h();
}
static async Task h()
{
throw new NotImplementedException();
}
]가 호출되면 예외가 관찰되고 다른 처리되지 않은 예외로 처리됩니다. 그러나 g ]가 호출되면 예외는 결코 관찰되지 않으며
taskscheduler.unobservedTaskexception 핸들러에 의해 처리됩니다.
모범 사례
일반적인 모범 사례로서 async
메소드에서 항상 async 메소드에서 항상
task 를 반환합니다
void return type. 이를 통해 예외가 올바르게 처리되고 발신자가
대기하는 작업을 선택하고 진행 상황을 추적 할 수 있습니다.
async /
에 대한 Microsoft의 문서를 참조하십시오 모범 사례 : [&&)
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3