无状态Statemachine框架和高CPU使用率

时间:2012-08-22 09:50:02

标签: c# .net state-machine stateless-state-machine

我正在使用无状态框架来创建StateMachine。 我的主应用程序是一个调用DataManager类的ConsoleApplication 调用启动GetData的{​​{1}}函数,然后使用状态机执行Task函数。

我的问题是,当StateMachine运行时,我获得了大约50%的CPU使用率! 当我使用简单的switch语句和相同的Task实现StateMachine时 它以0%的CPU使用率运行! 我是否有一些编码错误或者是无状态框架的行为?

GetData函数

Receiver

DataManager类

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;
} 

此致 迈克尔

2 个答案:

答案 0 :(得分:3)

更改等待循环

     while (_machine.State != State.End)
     {
         Thread.Sleep(10); // Only check once in a while
     }

在没有循环的情况下非常有效地执行此操作的另一种方法;

创建ManualResetEventSlim对象;

 ManualResetEventSlim mre = new ManualResetEventSlim(false);

等待循环变为

 mre.Wait(); // Waits untill the mre is signaled

当_machine.State变为State.End时应该调用

 mre.Set();

将向服务员发出信号并导致mre.Wait()停止等待

答案 1 :(得分:0)

你的CPU是50%,因为你有2个内核,而你的线程正在消耗其中一个带有while循环的100%。

switch语句没有等待循环,所以它不会消​​耗CPU。

不要手动等待,只需实施Event-Based Asynchronous Pattern(EAP)

  • 将Mark Receiver()标记为void,因此应删除return语句。
  • 在您的DataManager类上声明一个类似“OperationDone”的事件。
  • 在steate机器的最后一步使用_outputList触发事件。
  • 捕获事件以返回值。

现在唯一的CPU消耗将由状态机框架完成。

另一个有用的链接:如何:Wrap EAP Patterns in a Task