Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

  • 10의 배수마다.  사일런트하게 8을 증가한다, 단 8을 증가하는것은 1초가 소모되는 지연작업이다.
  • 사용자의 클릭에 반응하여 카운팅이 증가하는것은 블락 없이 즉각적이여야 한다.
  • 사용자에의한 숫자증가 1과, 감추어진 룰에의해 8증가하는것은 모두 스레드 세이프해야한다.


다음과 같이 기존 액터를 약간 수정합니다.

Code Block
themeEmacs
using Akka.Actor;
using System.Threading.Tasks;

namespace AkkaBlazorApp.Actors
{
    public enum CmdCount
    {
        CUR_NUM = 0,
        ADD_NUM = 1,
        ADD_NUM2 = 2,
    }

    public class CountActor : ReceiveActor
    {
        protected int currentCount = 0;

        public CountActor()
        {
            ReceiveAsync<CmdCount>(async cmdCount =>
            {
                if(cmdCount == CmdCount.CUR_NUM)
                {
                    Sender.Tell(currentCount);
                }
                else if(cmdCount == CmdCount.ADD_NUM)
                {
                    currentCount += 1;
                    Sender.Tell(currentCount);

                    if(currentCount % 10 == 0)
                    {
                        //10의 배수마다 지연증가를 작동합니다.
                        DelayIncrease();
                    }                    
                }
                else if (cmdCount == CmdCount.ADD_NUM2)
                {
                    // 지연증가가 안전하게 처리됩니다.
                    currentCount += 8;                    
                }
            });
        }

        protected void DelayIncrease()
        {
            Task.Run(async () =>
            {
                //긴작업으로 인해 지연이 발생하여도 액터는 멈추지 않습니다.
                await Task.Delay(1000);                
                CmdCount reply = CmdCount.ADD_NUM2;
                return reply;
            }).PipeTo(Self);
        }
    }
}

...