State Machine을 만들기 위해 Stateless Framework를 사용하고 있습니다. 내 메인 애플리케이션은 DataManager
클래스를 호출하는 ConsoleApplication이며, 은 Task
을 시작하는 GetData
함수를 호출하고이 클래스는 상태 시스템과 함께 Receiver
함수를 실행합니다.Stateless Statement Framework 및 높은 CPU 사용률
내 문제는 StateMachine이 실행될 때 약 50 %의 CPU 사용률이 발생한다는 것입니다. 간단한 스위치 명령문과 동일한 작업으로 StateMachine을 구현할 때 0 % CPU 사용으로 실행됩니다! 코딩 오류가 있습니까? 아니면 Stateless Framework의 기습가입니까?
GetData의 기능
public List<Byte[]> GetData()
{
List<Byte> rawData = new List<Byte[]>();
ReceiveTask = Task.Factory.StartNew<List<Byte[]>>(() => Receiver());
//Wait until the Task is complete
ReceiveTask.Wait();
//return temp;
rawData = ReceiveTask.Result;
return rawData;
}
DataManager는 클래스
public partial class DataManager
{
int _expectedBlocks;
Byte[] _currentMessage = null;
Byte[] _firstMessage = null;
int _currentBlockNumber = 0;
enum State { Idle, Start, Next, Check, End }
enum Trigger { DataOK, DataRequest, ReceivingFirstBlock, ReceivingNextBlock, LastPacketReceived, WaitForNext }
Dictionary<int, Byte[]> _receivedData;
List<Byte[]> _outputList;
StateMachine<State, Trigger> _machine;
private List<Byte[]> Receiver()
{
_currentMode = Mode.Receive;
m_source.MessageReceivedEvent +=new EventHandler<WSANMessageResponseEventArgs>(m_source_MessageReceivedEvent);
m_source.StartConnection();
_machine = new StateMachine<State, Trigger>(State.Idle);
_receivedData = new Dictionary<int, byte[]>();
_outputList = new List<byte[]>();
//Config StateMachine
_machine.Configure(State.Idle)
.OnEntry(() => OnIdle())
.OnExit(() => ExitIdle())
.Permit(Trigger.ReceivingFirstBlock, State.Start);
_machine.Configure(State.Start)
.OnEntry(() => OnStart())
.Permit(Trigger.ReceivingNextBlock, State.Next);
_machine.Configure(State.Next)
.OnEntry(() => OnNext())
.Permit(Trigger.WaitForNext, State.Start)
.Permit(Trigger.LastPacketReceived, State.Check);
_machine.Configure(State.Check)
.OnEntry(() => OnCheck())
.Permit(Trigger.DataOK, State.End)
.Permit(Trigger.DataRequest, State.Idle);
_machine.Configure(State.End)
.OnEntry(() => OnEnd());
while (_machine.State != State.End)
{
}
_currentMode = Mode.Idle;
return _outputList;
}
감사 마이클