CHOU

[MSRDS] CCR 에서 Arbiter.Receive 알아보기 본문

Tech/Microsoft Products

[MSRDS] CCR 에서 Arbiter.Receive 알아보기

chobabo 2009. 3. 23. 23:33

 Arbiter.Receive는 특정 포트에 지정된 메세지가 도착하면 해당 핸들러가 실행되도록 하는 기능을 수행 합니다. 즉 특정 메세지를 myStatus라는 클래스로 정의하였을 때, 이 메세지를 수신하는 포트를 myStatusPort라고 정의 합니다. 이 때 myHandler라는 이름의 핸들러의 연결을 아래와 같이 정의할 수 있습니다.

ITask myTask = Arbiter.Receive(false, myStatusPort, myHandler);

Arbiter.Receive는 결과를 ITask 형식으로 리턴합니다. http://cafe.naver.com/msrskorea 에 김영준 수석님께서 올려주신 예제를 통해 좀 더 알아보겠습니다.

1. 앞선 예제와 마찬가지로 C# 프로젝트를 오픈해서 Microsoft.Ccr.Core.dll을 레퍼런스에 추가하고 코드 상단에 using을 이용하여 정의해 줍니다.


그림1. 레퍼런스 추가 화면



2. 폼에 버튼과 리스트박스를 추가해 줍니다.


그림2. 폼 생성화면



3. 버튼 이벤트 부분에 아래와 같은 코드를 추가해 줍니다.

        private void button1_Click(object sender, EventArgs e)
        {
            using (Dispatcher dispatcher = new Dispatcher(0, "여섯번째 예제"))
            {
                DispatcherQueue dq = new DispatcherQueue("DispathcerQueue", dispatcher);

                //메세지를 받을 포트를 정의합니다.
                Port<myStatus> myStatusPort = new Port<myStatus>();

                myStatus myStatus1 = new myStatus();
                myStatus myStatus2 = new myStatus();

                myStatus1.inputStr = "Test String 1";
 
                //포트에 추가합니다.
                myStatusPort.Post(myStatus1);

                //해당 포트에 메세지가 수신되면 해당 핸들러가 수행되도록 하는 Task를 생성합니다.
                ITask myTask = Arbiter.Receive(true, myStatusPort, myHandler);

                myStatus2.inputStr = "Test String 2";

                //insert the item into the port
                myStatusPort.Post(myStatus2);

                Arbiter.Activate(dq, myTask);

                //잠시 기다렸다 실행합니다.
                System.Threading.Thread.Sleep(300);

                //결과를 출력합니다.

                listBox1.Items.Add("[1] " + myStatus1.outputStr);
                listBox1.Items.Add("[2] " + myStatus2.outputStr);

            }
        }

        //수신받을 메세지 타입을 클래스로 정의해야 함
        public class myStatus
        {
            public String inputStr = null;
            public String outputStr = null;
        }

        public void myHandler(myStatus myStatus)
        {
            //입력받은 값에 현재 날짜와 시간을 더해서 outputStr 변수에 저장함
            myStatus.outputStr = System.DateTime.Now.ToString() + " : " + myStatus.inputStr;
        }
    }

4. 다음과 같이 실행되는 것을 보실 수 있습니다.


그림3. 결과 화면

 Arbiter.Receive 를 정의할 때, 맨 처음에 오는 Bool 값은 해당 포트와 핸들러 매핑 정보를 유지시킬 것인지, 아니면, 잠시 한번만 수행하고 없앨 것인지를 지정합니다. 값이 true면 해당 매핑 정보가 유지되며, false이면 한번 수행하고 매핑 정보가 사라집니다.

아래 영상은 Arbiter.Receive 메소드 첫번째 파라미터를 변화를 줄때 나타나는 변화를 보여주는 것 입니다. 참고하시기 바랍니다.


영상1. bool 값을 바꿨을 때 결과 변화 영상



참고자료

1. http://cafe.naver.com/msrskorea

2. 예제 코드 파일