이 문서에서는 다음 컴파일러 오류를 다룹니다.
-
CS1983: 비동기 메서드이므로 반환 식은 '
Task<T>'이 아닌 'T' 형식이어야 합니다. - CS1985: catch 절에서 대기할 수 없습니다.
-
CS1986: '
await'을 사용하려면 형식에 적합한 'GetAwaiter' 메서드가 있어야 합니다. - CS1989: 비동기 람다 식을 식 트리로 변환할 수 없습니다.
- CS1991: 'Type'은 Windows 런타임 이벤트이고 'event'는 일반 .NET 이벤트이므로 'event'를 구현할 수 없습니다.
-
CS1992: '' 연산자는 '
awaitasync' 한정자로 표시된 메서드 또는 람다 식 내에 포함된 경우에만 사용할 수 있습니다. -
CS1994: '
async' 한정자는 본문이 있는 메서드에서만 사용할 수 있습니다. -
CS1995: '
await' 연산자는 초기 '' 절의 첫 번째 컬렉션 식 내의 쿼리 식 또는 'fromjoin' 절의 컬렉션 식 내에서만 사용할 수 있습니다. - CS1996: lock 문의 본문에서 대기할 수 없습니다.
- CS1997: 함수는 값을 반환하는 비동기 메서드이므로 반환 키워드 뒤에 개체 식이 있으면 안 됩니다.
-
CS1998: 이 비동기 메서드는 '
await' 연산자가 부족하고 동기적으로 실행됩니다. 'await' 연산자를 사용하여 비차단 API 호출을 기다리거나 'await Task.Run(...)'를 사용하여 백그라운드 스레드에서 CPU 바인딩된 작업을 수행하는 것이 좋습니다. -
CS4008: ''
void을 기다릴 수 없습니다. - CS4009: void 또는 int 반환 진입점은 비동기일 수 없습니다.
-
CS4014: 이 호출이 대기되지 않으므로 호출이 완료되기 전에 현재 메서드의 실행이 계속됩니다. 호출 결과에 연산자를 적용하는
await것이 좋습니다. -
CS4032: '
await' 연산자는 비동기 메서드 내에서만 사용할 수 있습니다. 이 메서드를 'async' 한정자로 표시하고 반환 형식을 ''Task<T>로 변경하는 것이 좋습니다. -
CS4033: '
await' 연산자는 비동기 메서드 내에서만 사용할 수 있습니다. 이 메서드를 'async' 한정자를 사용하여 표시하고 반환 형식을 ''Task로 변경하는 것이 좋습니다. - CS8892: 동기 진입점을 찾았으므로 메서드가 진입점으로 사용되지 않습니다.
-
CS9123: '
&' 연산자는 비동기 메서드의 매개 변수 또는 지역 변수에 사용하면 안 됩니다. -
CS9330: '
MethodImplAttribute.Async'은(는) 메서드에 수동으로 적용할 수 없습니다. 메서드 'async'를 표시합니다.
미뤄두기 식 요구 사항
- CS1985: catch 절에서 대기할 수 없습니다.
-
CS1986: '
await'을 사용하려면 형식에 적합한 'GetAwaiter' 메서드가 있어야 합니다. -
CS1992: '' 연산자는 '
await' 한정자가 표시된async메서드 또는 람다 식에 포함된 경우에만 사용할 수 있습니다. -
CS1995: '
await' 연산자는 초기 '' 절의 첫 번째 컬렉션 식 내의 쿼리 식 또는 'fromjoin' 절의 컬렉션 식 내에서만 사용할 수 있습니다. - CS1996: lock 문의 본문에서 대기할 수 없습니다.
-
CS4008: ''
void을 기다릴 수 없습니다. -
CS4032: '
await' 연산자는 비동기 메서드 내에서만 사용할 수 있습니다. 이 메서드를 'async' 한정자를 사용하여 표시하고 반환 형식을 ''Task<T>로 변경하는 것이 좋습니다. -
CS4033: '
await' 연산자는 비동기 메서드 내에서만 사용할 수 있습니다. 이 메서드를 'async' 한정자를 사용하여 표시하고 반환 형식을 ''Task로 변경하는 것이 좋습니다.
연산자를 await 올바르게 사용하려면 다음 규칙을 따릅니다. 자세한 내용은 async 및 await을 사용한 비동기 프로그래밍을 참조하세요.
- catch 절에서는
await을 사용하지 마세요 (CS1985). try 블록 및 최종 블록(C# 6 이상)에서 사용할await수 있지만 catch 블록은 예외 처리 및 제어 흐름과 관련된 특별한 문제를 제시합니다. -
await를 문장 블록 내부에서 사용하지 마세요(CS1996). 컴파일러는 교착 상태가 발생하기 쉬운 코드를 내보내는 것을 방지하기 위해 이를 지원하지 않습니다. - 쿼리 식(CS1995) 내에서 특정 위치, 즉 초기 절의 첫 번째 컬렉션 식 또는
from절의 컬렉션 식 내부에서만await을 사용합니다. - 사용하기 전에 메서드 또는 람다 식을 한정자를 사용하여
asyncawait표시합니다(CS1992, CS4032, CS4033). - 대기된 형식에 awaiter 형식(
GetAwaiter)을 반환하는 액세스 가능한 메서드가 있는지 확인합니다. -
await형식의 식에void을(를) 적용하지 마십시오(CS4008). - 반환 형식을
Task값을 반환하지 않는 메서드 또는Task<T>값을 반환하는 메서드로 변경합니다.
비동기 메서드 서명 요구 사항
-
CS1983: 비동기 메서드이므로 반환 식은 '
Task<T>'이 아닌 'T' 형식이어야 합니다. -
CS1994: '
async' 한정자는 본문이 있는 메서드에서만 사용할 수 있습니다. - CS4009: void 또는 int 반환 진입점은 비동기일 수 없습니다.
- CS8892: 동기 진입점을 찾았으므로 메서드가 진입점으로 사용되지 않습니다.
-
CS9330: '
MethodImplAttribute.Async'은(는) 메서드에 수동으로 적용할 수 없습니다. 메서드 ''async를 표시합니다.
비동기 메서드를 올바르게 선언하려면 다음 서명 요구 사항을 따릅니다. 자세한 내용은 비동기 주 반환 값을 참조하세요.
- 유효한 형식
void중 하나인 , , TaskTask<T>작업과 유사한 형식 IAsyncEnumerable<T>또는 IAsyncEnumerator<T> (CS1983) 중 하나를 반환합니다. - 본문이 있는
async메서드(CS1994)에서만 한정자를 사용합니다. 인터페이스 또는 클래스의async추상 메서드에 대한 한정자를 제거합니다. - C# 7.1 이상으로 업데이트하여 진입점에서
async를Main과 함께 사용하거나, 이전 버전의 진입점(async)에서 CS4009를 사용하지 않도록 합니다. - 동기화 및 비동기 진입점(CS8892)이 모두 있는 경우 동기 진입점을 제거합니다.
-
async수동으로 적용하는 대신 키워드를MethodImplAttribute.Async사용합니다(CS9330).
비동기 사례
- CS1989: 비동기 람다 식을 식 트리로 변환할 수 없습니다.
- CS1991: 'Type'은 Windows 런타임 이벤트이고 'event'는 일반 .NET 이벤트이므로 'event'를 구현할 수 없습니다.
- CS1997: 함수는 값을 반환하는 비동기 메서드이므로 반환 키워드 뒤에 개체 식이 있으면 안 됩니다.
-
CS1998: 이 비동기 메서드는 '
await' 연산자가 부족하고 동기적으로 실행됩니다. 'await' 연산자를 사용하여 비차단 API 호출을 기다리거나 'await Task.Run(...)'를 사용하여 백그라운드 스레드에서 CPU 바인딩된 작업을 수행하는 것이 좋습니다. -
CS4014: 이 호출이 대기되지 않으므로 호출이 완료되기 전에 현재 메서드의 실행이 계속됩니다. 호출 결과에 연산자를 적용하는
await것이 좋습니다. -
CS9123: '
&' 연산자는 비동기 메서드의 매개 변수 또는 지역 변수에 사용하면 안 됩니다.
비동기 코드를 올바르게 작성하고 일반적인 문제를 방지하려면 다음 모범 사례를 따르세요. 자세한 내용은 async 및 await을 사용한 비동기 프로그래밍을 참조하세요.
- 항상 또는 Task(Task<TResult>)를 반환하는 비동기 메서드에 대한 호출을 await합니다. 예상치 못한 호출은 예외 손실 및 예기치 않은 동작을 유발할 수 있습니다.
- 비제네릭 비동기 메서드에서는 값을 반환하지 말고
Task<T>를 대신 사용하세요 (CS1997). - 비동기 메서드에 하나
await이상의 연산자를 포함하거나 한정자(async)를 제거 합니다. - 메서드가
Task반환해야 하는 경우return문장을 제거합니다(CS1997, CS1998). - 값을 반환하도록
Task<T>메서드의 반환 형식을 변경합니다(CS1997, CS1998). - 비동기 상태 컴퓨터(
async)가 필요하지 않은 경우 한정자를 제거하고 작업을 직접 반환합니다. - 식 트리에서 비동기 메서드를 사용하지 마세요(CS1989). 식 트리는 코드를 데이터로 나타내며 비동기 메서드에 필요한 복잡한 상태 컴퓨터 변환을 지원하지 않습니다.
- 인터페이스 또는 WinRT 이벤트의 접근자를 비동기(CS1991)로 표시하거나 제거하지 마세요. 이는 Windows 런타임 상호 운용성에 대한 플랫폼별 제한 사항입니다.
- 비동기 메서드(
&CS9123) 내 식에서 address-of 연산자()를 사용하지 마세요. 대상은 일시 중단 중에 메모리에 재배치되어 포인터가 유효하지 않을 수 있습니다.
GitHub에서 Microsoft와 공동 작업
이 콘텐츠의 원본은 GitHub에서 찾을 수 있으며, 여기서 문제와 끌어오기 요청을 만들고 검토할 수도 있습니다. 자세한 내용은 참여자 가이드를 참조하세요.
.NET