부모글 보이기/감추기 AD BLOCK 해제 요청 이 글에는 광고가 많이 들어가 있지 않습니다. adblock을 해제하셔도 글을 읽는데 그다지 부담이 없으니 해제를 부탁드립니다. (연관된 글이 1개 있습니다.) (시리즈 글이 9개 있습니다.) .NET Framework: 698. C# 컴파일러 대신 직접 구현하는 비동기(async/await) 코드 ; https://www.sysnet.pe.kr/2/0/11351 .NET Framework: 716. async 메서드의 void 반환 타입 사용에 대하여 ; https://www.sysnet.pe.kr/2/0/11414 .NET Framework: 717. Task를 포함하지 않는 async 메서드의 동작 방식 ; https://www.sysnet.pe.kr/2/0/11415 .NET Framework: 719. Task를 포함하는 async 메서드의 동작 방식 ; https://www.sysnet.pe.kr/2/0/11417 .NET Framework: 731. C# - await을 Task 타입이 아닌 사용자 정의 타입에 적용하는 방법 ; https://www.sysnet.pe.kr/2/0/11456 .NET Framework: 737. C# - async를 Task 타입이 아닌 사용자 정의 타입에 적용하는 방법 ; https://www.sysnet.pe.kr/2/0/11484 .NET Framework: 813. C# async 메서드에서 out/ref/in 유형의 인자를 사용하지 못하는 이유 ; https://www.sysnet.pe.kr/2/0/11850 닷넷: 2138. C# - async 메서드 호출 원칙 ; https://www.sysnet.pe.kr/2/0/13405 닷넷: 2147. C# - 비동기 메서드의 async 예약어 유무에 따른 차이 ; https://www.sysnet.pe.kr/2/0/13421 C# async 메서드에서 out/ref/in 유형의 인자를 사용하지 못하는 이유 다음과 같은 질문이 있군요. ^^ c# 의 async 에서 메서드 인자제한에 의문점이... ; https://throwbug.com/524/c%23-%EC%9D%98-async-%EC%97%90%EC%84%9C-%EB%A9%94%EC%84%9C%EB%93%9C-%EC%9D%B8%EC%9E%90%EC%A0%9C%ED%95%9C%EC%97%90-%EC%9D%98%EB%AC%B8%EC%A0%90%EC%9D%B4?show=525#a525 그동안 제 글을 ^^ 잘 읽어보신 분이 있다면 아마 저 해답을 알 수 있을 것입니다. 어떻게 설명이 이어지는지 한번 찾아볼까요? ^^ 이것을 이해하기 위해서는 우선 async 메서드를 C#이 풀이하는 방법을 알아야 합니다. 이에 대해서는 다음의 글에 적어두었습니다. C# 컴파일러 대신 직접 구현하는 비동기(async/await) 코드 ; https://www.sysnet.pe.kr/2/0/11351 따라서 C# async 메서드에 지정한 out 또는 ref (또는 C# 7.2의 in) 인자는 IAsyncStateMachine 인터페이스를 상속받는 상태 머신 클래스에 필드로 정의되어야 합니다. 문제는, out/ref/in 유형의 필드는 다음과 같이 ref 예약어가 붙는 식이어야 한다는 점입니다. private async Task<string> GetFileContents(out int length) { return await new TaskFactory().StartNew(() => { return "test"; }); } class CallAsync_StateMachine : IAsyncStateMachine { ref int _length; // out으로 반환될 인자 값 string _text; // 반환 값 //...[생략]... } 여기서 다시 문제는, 저런 닷넷의 관리 포인터가 클래스의 필드로는 정의될 수 없다는 것이고 이것을 다음의 글에서 설명했습니다. 닷넷의 관리 포인터(Managed Pointer)와 System.TypedReference ; https://www.sysnet.pe.kr/2/0/11529 결국, 1차적으로는 async 메서드에 out/ref/in을 지원하지 못하는 것은 C# 컴파일러의 문제지만 사실 "닷넷의 관리 포인터(Managed Pointer)와 System.TypedReference" 글에도 썼듯이 이것은 .NET CLR에 현재 구현된 GC의 제약 때문에 발생한 것입니다. Fields and array elements are not permitted to have & types. & cannot be boxed either. These restrictions are a bit artificial. It just makes the job of GC easier if & themselves are never on the heap. [이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.] [다음 글] Linux: 8. C# - 리눅스 환경에서 DllImport 대신 라이브러리 동적 로드 처리[이전 글] .NET Framework: 812. pscp.exe 기능을 C#으로 제어하는 방법 [연관 글] .NET Framework: 1000. C# - CS8344 컴파일 에러: ref struct 타입의 사용 제한 메서드 [최초 등록일: 3/18/2019] [최종 수정일: 3/18/2019] 이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다. by SeongTae Jeong, mailto:techsharer at outlook.com 비밀번호 댓글 작성자 1 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 ... NoWriterDateCnt.TitleFile(s) 13323정성태4/16/20234149개발 환경 구성: 677. Octave에서 Excel read/write를 위한 io 패키지 설치13322정성태4/15/20234946VS.NET IDE: 182. Visual Studio - 32비트로만 빌드된 ActiveX와 작업해야 한다면?13321정성태4/14/20233741개발 환경 구성: 676. WSL/Linux Octave - Python 스크립트 연동13320정성태4/13/20233745개발 환경 구성: 675. Windows Octave 8.1.0 - Python 스크립트 연동13319정성태4/12/20234202개발 환경 구성: 674. WSL 2 환경에서 GNU Octave 설치13318정성태4/11/20234010개발 환경 구성: 673. JetBrains IDE에서 "Squash Commits..." 메뉴가 비활성화된 경우13317정성태4/11/20234167오류 유형: 855. WSL 2 Ubuntu 20.04 - error: cannot communicate with server: Post http://localhost/v2/snaps/...13316정성태4/10/20233494오류 유형: 854. docker-compose 시 "json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)" 오류 발생13315정성태4/10/20233671Windows: 245. Win32 - 시간 만료를 갖는 컨텍스트 메뉴와 윈도우 메시지의 영역별 정의113314정성태4/9/20233746개발 환경 구성: 672. DosBox를 이용한 Turbo C, Windows 3.1 설치13313정성태4/9/20233843개발 환경 구성: 671. Hyper-V VM에 Turbo C 2.0 설치 [2]13312정성태4/8/20233824Windows: 244. Win32 - 시간 만료를 갖는 MessageBox 대화창 구현 (개선된 버전)113311정성태4/7/20234322C/C++: 163. Visual Studio 2022 - DirectShow 예제 컴파일(WAV Dest)13310정성태4/6/20233885C/C++: 162. Visual Studio - /NODEFAULTLIB 옵션 설정 후 수동으로 추가해야 할 library13309정성태4/5/20234054.NET Framework: 2107. .NET 6+ FileStream의 구조 변화13308정성태4/4/20233945스크립트: 47. 파이썬의 time.time() 실숫값을 GoLang / C#에서 사용하는 방법13307정성태4/4/20233730.NET Framework: 2106. C# - .NET Core/5+ 환경의 Windows Forms 응용 프로그램에서 HINSTANCE 구하는 방법13306정성태4/3/20233569Windows: 243. Win32 - 윈도우(cbWndExtra) 및 윈도우 클래스(cbClsExtra) 저장소 사용 방법13305정성태4/1/20233914Windows: 242. Win32 - 시간 만료를 갖는 MessageBox 대화창 구현 (쉬운 버전)113304정성태3/31/20234278VS.NET IDE: 181. Visual Studio - C/C++ 프로젝트에 application manifest 적용하는 방법13303정성태3/30/20233571Windows: 241. 환경 변수 %PATH%에 DLL을 찾는 규칙13302정성태3/30/20234194Windows: 240. RDP 환경에서 바뀌는 %TEMP% 디렉터리 경로13301정성태3/29/20234320Windows: 239. C/C++ - Windows 10 Version 1607부터 지원하는 /DEPENDENTLOADFLAG 옵션113300정성태3/28/20233958Windows: 238. Win32 - Modal UI 창에 올바른 Owner(HWND)를 설정해야 하는 이유13299정성태3/27/20233737Windows: 237. Win32 - 모든 메시지 루프를 탈출하는 WM_QUIT 메시지13298정성태3/27/20233682Windows: 236. Win32 - MessageBeep 소리가 안 들린다면? 1 2 3 4 5 6 7 8 9 10 11 [12] 13 14 15 ...