질문과 답변

C# 소멸자에서 await 구문 사용. 날짜:2022-3-10 2:19:20 조회수:143
작성자 : 꿀꿀이호떡
포인트 : 9
가입일 : 2021-09-23 14:14:22
방문횟수 : 8
글 1개, 댓글 2개
소개 :
작성글 보기
쪽지 보내기
~MyClass()
{
   close();
}
   
public async Task close() {
         ......
 return true;
}


위처럼 소멸자에서 close함수를 호출할 경우 await 구문을 사용하라는 경고가 뜨고요.
await close(); 로 하면 ~MyClass()가 async 함수가 아니라 에러가 발생하는데요.

소멸자에서 await 기능을 사용하려면 어떻게 해야하나요?



 

목록보기 삭제 수정 신고 스크랩

작가K 3월14일 8:05:09  

C#의 소멸자는 언제 호출될지 알 수 없어 거의 사용하지 않습니다.
async 키워드를 썼으면 내부의 코드중 비동기 처리할 부분에 await를 적어 주어야 합니다.
보통 Task.Run을 호출하여 새로운 스레드를 기동하는 형식입니다.
위 코드는 Task를 리턴하는 것으로 선언해 놓고 true를 리턴하고 있네요.
async, await 관련 예제를 먼저 살펴 보시는게 좋을 거 같습니다.

꿀꿀이호떡 3월29일 1:57:40  

안녕하세요.
우선 답변 감사드립니다.
제가 예제를 잘못 작성했습니다.

public async Task<bool> close() {

  // 내부에 자원 해제를 await 하는 코드가 있습니다.
  bool resutl = await Socket.Close();

  // 추가 내용....

 return result;
}


프로그램 종료 시 소멸자에서 close 함수를 호출해 자원을 해제할려고 합니다.

~MyClass()
{
   close();
}
처럼 하면 await 연산자를 쓰라는 경고가 뜨고요.


~MyClass()
{
   await close();
}
하면 async 메소드만 await를 사용할 수 있다고 나오는데요

~ async MyClass()
{
   await close();
}
소멸자에는 async 키워드를 추가할 수가 없는 것 같네요.
~ 앞, 뒤에 넣어봐도 다 에러가 납니다.


프로그램 종료 시 비동기 close 함수를 정상적으로 대기했다가 종료 시킬려면 어떻게 해야할까요?



 

꿀꿀이호떡 3월29일 2:11:30  

~MyClass()
{
   bool a = await close().Result;
}

말씀하신데로 예제를 찾아보니 .Result 라는 구문이 있어서 위와 같이 하니깐  증상이 해결됐습니다~


로그인하셔야 댓글을 달 수 있습니다.