라벨이 프로그래밍인 게시물 표시

NamedPipeServerStream.WaitForConnectionAsync(CancellationToken) 메서드가 토큰이 취소됐음에도 무기한 대기할 때 해결 방법

NamedPipeServerStream NamedPipeServerStream C#에서는 Named Pipe를 손쉽게 사용하기 위한 클래스인 NamedPipeServerStream , NamedPipeClientStream 을 지원합니다. 이 중 NamedPipeServerStream 은 그 이름에서 알 수 있듯 서버 기능 구현을 위한 스트림입니다. 연결 대기 서버는 당연히 클라이언트가 있어야 의미가 있습니다. 서버 혼자서는 아무것도 할 게 없기 때문이죠. 이런 당연한 얘기는 제쳐두고, 서버를 구현하다 보면 자연스레 클라이언트가 연결이 됐는지 안 됐는지 확인하는 코드가 필요하게 됩니다. TCP 소켓 같은 경우에는, AcceptAsync 등을 사용해 아예 클라이언트 소켓 자체를 받아오거나, Pending 메서드를 사용해 접속 대기중인 클라이언트가 있는지 확인할 수 있습니다. 그럼 NamedPipeServerStream 에는 뭐가 있을까요? WaitForConnection, WaitForConnectionAsync 당연히 NamedPipeServerStream 에도 클라이언트 접속 여부를 판단하는 메서드가 있습니다. 바로 WaitForConnection , WaitForConnectionAsync 입니다. 첫 번째 메서드는 동기 방식으로 대기합니다. 이 경우에는 해당 메서드가 호출된 시점부터 클라이언트가 접속할 때까지 호출된 스레드가 블럭 됩니다. 이번 포스트에서 다룰 것은 두 번째 메서드, WaitForConnectionAsync 입니다. CancellationToken WaitForConnectionAsync 메서드는 인자로 CancellationToken 을 받을 수 있습니다. 따라서, 해당 토큰에 취소 요청이 받아들여지면 대기를 중지하고...

Typescript Enum의 Key 반환받기, 모든 키/값 리스트 반환받기

Typescript의 enum 키워드 Typescript의 enum 키워드 여타 다른 언어와 같이, 타입스크립트의 enum 키워드 역시 열거형을 나타내기 위해 사용됩니다. 그리고 마찬가지로, 다른 언어와 같이 멤버의 값은 정수형으로 변환되게 됩니다. 예를 들어 다음과 같은 코드가 있을 때, enum TestEnum { A, B, C, D, E, } 각각의 값은 다음과 같이 나타납니다. > TestEnum.A 0 > TestEnum.B 1 > TestEnum.C 2 > TestEnum.D 3 > TestEnum.E 4 즉, 열거형의 첫 번째 멤버부터 0으로 시작해 순차적으로 증가하는 방식입니다. 물론, 값을 지정할 수도 있습니다. 다음과 같이요. enum TestEnum { A = 3 , B, C, D, E, } 혹은, 플래그 형식으로 사용하기 위해 다음과 같이 지정할 수도 있습니다. enum FlagEnum { NOTHING = 0 , FRIENDLY = 1 << 0 , HOSTILE = 1 << 1 , NEUTRAL = 1 << 2 , SPECIAL = 1 << 3 , ALL = ~(~ 0 << 4 ), } 열거형 필드는 number를 반환. 그렇다면 열거형의 이름을 반환하려면? 좋습니다. 열거형의 필드를 참조하면 열거형의 값, 즉 number 값이 반환되는 것은 알겠습니다. 하지만 열거형의 이름, 즉 A, B, C, D, E 각각을 반환받기 위해서는 어떻게 해야할까요? 공식...

[C#/EF6] 서로 다른 컨텍스트가 업데이트된 레코드를 읽어야 할 때

여러개의 컨텍스트 사용 필연 우선 이 글은 커넥션 풀링과는 아주 관계가 없진 않으나, 관계가 없다고 생각한 채 읽으셔도 됨을 알려드립니다. 엔티티 프레임워크를 사용해 개발하다 보면 어쩔 수 없이 동일한 컨텍스트 클래스의 인스턴스를 여러 곳에서 생성해 사용하게 됩니다. 처음에 저는 단순한 프로젝트이니 그냥 컨텍스트 클래스를 싱글톤 패턴으로 만들어, 여러 사용처에서 호출해 사용하면 되지 않을까? 라는 어리석은 생각을 했으나, 아무리 단순한 프로젝트라도 그곳에 이벤트가 있고, 병렬 처리가 있다면, 그리고 그 곳에서 DB에 접근해야 한다면(즉, 컨텍스트 인스턴스 호출을 해야 한다면), 어쩔 수 없습니다. 싱글톤은 답이 아닙니다. 문제는 이렇게 할 경우에 여러 동일한 컨텍스트 클래스의 인스턴스에서 동일한 Entity의 정보를 읽고 쓸 수 있다는 것입니다. 예를 들어 동일한 컨텍스트 클래스의 서로 다른 인스턴스를 호출해 사용하는 A, B 클래스가 있다고 가정해봅시다. 아래 가정은 시간 순서로 쓰여졌습니다. B 인스턴스에서 Road 엔티티를 DB에서 컨텍스트로 읽어드렸습니다. (DB => In memory, FindAsync 사용) B 인스턴스에서 Road 엔티티의 (ICollection )Cars.Count 프로퍼티를 읽어 변수 prevCarCount 에 저장했습니다. B 인스턴스에서 유틸리티 클래스인 A 인스턴스의 AddCarOnRoad 를 호출했습니다. A 인스턴스에서 Road 엔티티의 (ICollection )Cars 프로퍼티를 수정했습니다. (새 컨텍스트 인스턴스에서 작업) B 인스턴스에서 Road 엔티티의 (ICollection )Cars.Count 프로퍼티를 읽어 변수 curCarCount 에 저장했습니다. B 인스턴스에서 prevCarCount와 curCarCount가 같으면 throw, 아니면 반환합니다. 위와 같은 상황에서, 어떤 한 로직을 빠뜨리면 3. 에서 Car 를 Road ...

[Kotlin] while문 안에서 변수에 대입하기

최근, 코틀린을 사용해 프로젝트를 진행하게 됐습니다. 그러던 중, 파일 I/O 작업이 필요하게 됐죠. 그래서, 평소 자바나 C#에서 하던대로 while문을 작성해봤으나 제대로 작동하지 않았습니다. 아래는 Java 코드입니다. while ((i = zipStream.read(buf)) != - 1 ) { // Do something... } 그리고 아래는 작성했던 코틀린 코드입니다. while ((i = zipStream.read(buf)) != -1) { // Do something... } 같은 것 같다고요? 맞습니다. 동일하게 작성했더니 안 되더라고요. 그래서 방법을 찾아봤습니다. 생각해보니, 람다 가 있었습니다. 익명 함수를 사용한 while문 내에서의 변수 할당 while ({i = zipStream.read(buf); i}() != -1) { // Do something... } 간단히 설명하면, zipStream.read(buf) 의 값을 변수 i 에 할당하고 그 값을 반환하는 익명 함수를 즉시 호출하고, 그 결과를 대조해 while문을 돌리면 되는 것이었죠! 이 과정에서 코틀린의 새로운 문법을 알게 됐습니다. 바로 익명 함수( { ... } )에서 return statement가 없으면 ; (세미콜론)을 대신 사용할 수 있다는 것입니다. 모두 유용하셨길 바라며, 오늘도 즐거운 하루 되시길 바랍니다. ​

[C#/WMI] 직접 혹은 C#으로 맥주소 변경하는 방법

이미지
MAC Address? 맥주소는 네트워크 인터페이스(랜카드 등)를 식별하는 용도 등으로 사용되는 고유한 식별 문자열입니다. 사실 깊게 들어가면 위 설명만으로는 많이 부족하지만, 이 글의 목적은 맥주소를 설명하는 것이 아니니 위키 링크 로 대체하도록 하겠습니다. 맥 주소를 변경하는 목적 사람마다 수많은 각기 다른 목적이 있겠으나, 맥 주소의 특성상 ISP에서 맥주소가 바뀌면 다른 사용자로 인식해 새로운 아이피를 할당해줍니다. 즉, 아이피를 강제로 변경하는 용도 로 쓰는 것이 가장 많지 않을까 싶네요. 저같은 경우엔 웹 어플리케이션이 수많은 아이피에 대해 각기 다른 응답을 잘 보내주는지 테스트하는 용도로 사용했습니다. 맥주소 변경하기 직접 변경하기 당연하게도, 직접 맥주소를 변경할 수 있습니다. 제가 아는 방법은 두 가지가 있는데, 첫번째는 장치 관리자의 네트워크 인터페이스 속성에서 MacAddress를 다른 문자열로 할당하는 방법입니다. 장치 관리자에서 맥주소를 변경하는 화면 그러나 위 방법은 일부 맥주소 변경 항목이 없는 랜카드에서는 사용할 수 없습니다. 그래서 찾은 방법이 레지스트리 변경입니다. 레지스트리 변경으로 맥주소 변경 (윈도우 10 기준) HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class{4d36e972-e325-11ce-bfc1-08002be10318} 키로 이동합니다. 그럼 아래와 같은 하위 키들이 보입니다. 4자리 숫자로 이뤄진 하위 키 목록 더 밑으로 내리면 Configuration, Properties라는 하위 키가 있으나, 지금 중요한건 오로지 4자리 숫자로 이뤄진 하위 키 입니다. 이 하위 키들은 각각 현재 컴퓨터에 설치돼있는 네트워크 인터페이스에 대응되는 인덱스입니다. 여기서 현재 인터넷에 연결돼있는 네트워크 인터페이스와 대응되는 키를 찾으면 됩니다. 어떻게 찾냐고요? 각각 하위 키를 클릭해보시면 알게 됩니다. 하위 ...