2013-03-22 3 views
13

문자열을 반환하는 일부 함수에서 일부 비동기 작업을 수행하려고합니다.Await/async 참조 오류

async private void button1_Click(object sender, EventArgs e) 
{ 
    string output = await thr_calc(this, null); 
} 

async private Task<string> thr_calc(object sender, EventArgs e) 
{ 
    return await zzztest();    
} 

string zzztest() 
{ 
    string asd; 
    //some stuff here 
    return asd; 
} 

그러나 각 문자열에 오류가 발생하여 async/await가 포함되어 있습니다! 메신저의 러시아 버전을 사용하여 Windows 바탕 화면에 대한 표현의 2012, 여기에 오류의 번역 :

'비동기'수정 자에 필요한 모든 유형을 찾을 수 없습니다. 잘못된 프레임 워크 버전을 목표로 삼고 있습니까, 아니면 어셈블리에 대한 참조가 누락 되었습니까?

그리고 2 오류 :

미리 정의 된 유형 'System.Runtime.CompilerServices.IAsyncStateMachine이'정의되거나 수입되지 내가 그 참조를 찾을 수 없습니다

. 나는 비동기/이전에 기다리고 사용하려고했는데 괜찮 았어, 지금은 모든 일을하고 그 일을하지. 내가 누락 된 것?

thr_calc에서
+0

러시아어로 복사하여 붙여 넣기 오류를 줄 수 있습니까? 도움이 될까요? –

+1

프레임 워크 4.5를 사용하고 있습니까? –

+0

예, 프레임 워크 4.5 –

답변

16
  • 는 사용

    return zzztest() 
    
  • 또한
  • , 당신은 닷넷 4.5 이상 (즉, "비동기"가 도입되었을 때의)

사용하는 프로젝트를 설정했는지 확인 zzztest 긴 실행 작업 인 경우
+0

그래, 그렇지만 오류는 동일합니다. –

+3

그것은 나를 위해 컴파일되기 때문에 이상합니다. "응용 프로그램"아래에서 프로젝트의 속성 아래에서 프레임 워크가 4.5인지 확인 했습니까? – redtuna

+0

(잘 컴파일하면 asd에 값을 할당 할 수 있지만 컴파일 오류를 수정하는 데 아무런 문제가 없을 것입니다.) – redtuna

1

, 당신은 백그라운드 스레드에서 실행하기 위해이 작업을 수행 할 수 있습니다

async private Task<string> thr_calc(object sender, EventArgs e) 
{ 
    return await Task.Run<string>(() => zzztest());    
} 

위의 코드는 컴파일 오류도 해결합니다.

zzztest이 장기 실행 작업이 아닌 경우 await/async을 사용하지 않는 것이 좋습니다.

7

.NET 4.0 프로젝트에서 Nuget의 Microsoft.Bcl.Async 패키지를 설치하면 '미리 정의 된 형식'System.Runtime.CompilerServices.IAsyncStateMachine '이 (가) 정의 또는 가져 오기되지 않았습니다.'라는 문제가 해결되었습니다. VS의 nuget 패키지 관리자에서 'bcl'을 검색하고 비동기 모양의 패키지 관리자를 설치하십시오.