我正在使用无状态框架来创建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;
}
此致 迈克尔
答案 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):
现在唯一的CPU消耗将由状态机框架完成。
另一个有用的链接:如何:Wrap EAP Patterns in a Task。