부모글 보이기/감추기 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 비밀번호 댓글 쓴 사람 ... 16 17 18 19 20 21 22 23 [24] 25 26 27 28 29 30 ... NoWriterDateCnt.TitleFile(s) 11929정성태6/5/20191985.NET Framework: 841. Windows Forms/C# - 클립보드에 RTF 텍스트를 복사 및 확인하는 방법11928정성태6/5/20191828오류 유형: 543. PowerShell 확장 설치 시 "Catalog file '[...].cat' is not found in the contents of the module" 오류 발생11927정성태6/5/20192171스크립트: 15. PowerShell ISE의 스크립트를 복사 후 PPT/Word에 붙여 넣으면 한글이 깨지는 문제 [1]11926정성태6/4/20193137오류 유형: 542. Visual Studio - pointer to incomplete class type is not allowed11925정성태6/4/20192494VC++: 131. Visual C++ - uuid 확장 속성과 __uuidof 확장 연산자111924정성태5/30/20192674Math: 57. C# - 해석학적 방법을 이용한 최소 자승법 [1]111923정성태5/30/20192429Math: 56. C# - 그래프 그리기로 알아보는 경사 하강법의 최소/최댓값 구하기111922정성태5/30/20191775.NET Framework: 840. ML.NET 데이터 정규화111921정성태5/28/20193127Math: 55. C# - 다항식을 위한 최소 자승법(Least Squares Method)111920정성태5/28/20191686.NET Framework: 839. C# - PLplot 색상 제어11919정성태5/27/20192721Math: 54. C# - 최소 자승법의 1차 함수에 대한 매개변수를 단순 for 문으로 구하는 방법 [1]111918정성태5/27/20192814Math: 53. C# - 행렬식을 이용한 최소 자승법(LSM: Least Square Method)111917정성태5/24/20192781Math: 52. MathNet을 이용한 간단한 통계 정보 처리 - 분산/표준편차111916정성태5/24/20192006Math: 51. MathNET + OxyPlot을 이용한 간단한 통계 정보 처리 - Histogram111915정성태5/24/20192459Linux: 11. 리눅스의 환경 변수 관련 함수 정리 - putenv, setenv, unsetenv11914정성태5/24/20193015Linux: 10. 윈도우의 GetTickCount와 리눅스의 clock_gettime111913정성태5/24/20191918.NET Framework: 838. C# - 숫자형 타입의 bit(2진) 문자열, 16진수 문자열 구하는 방법111912정성태5/23/20192012VS.NET IDE: 137. Visual Studio 2019 버전 16.1부터 리눅스 C/C++ 프로젝트에 추가된 WSL 지원11911정성태5/23/20192075VS.NET IDE: 136. Visual Studio 2019 - 리눅스 C/C++ 프로젝트에 인텔리센스가 동작하지 않는 경우11910정성태5/24/20194002Math: 50. C# - MathNet.Numerics의 Matrix(행렬) 연산111909정성태5/25/20192657.NET Framework: 837. C# - PLplot 사용 예제 [1]111908정성태5/22/20191912.NET Framework: 836. C# - Python range 함수 구현111907정성태6/4/20191440오류 유형: 541. msbuild - MSB4024 The imported project file "...targets" could not be loaded11906정성태5/21/20191194.NET Framework: 835. .NET Core/C# - 리눅스 syslog에 로그 남기는 방법11905정성태5/21/20191777.NET Framework: 834. C# - 폴더 경로 문자열에서 "..", "." 표기를 고려한 최종 문자열을 얻는 방법 - 두 번째 이야기11904정성태5/21/20193790.NET Framework: 833. C# - Open Hardware Monitor를 이용한 CPU 온도 정보1 ... 16 17 18 19 20 21 22 23 [24] 25 26 27 28 29 30 ...