110,567
社区成员
发帖
与我相关
我的任务
分享
数据库能不能先用缓存替代,用以排除数据库的影响,因为从描述中可以看出,项目对实时性要求较高,数据库恰恰是拖后腿的存在。
4000 到达 4000预检查 1000到达 1000预检查 1000检查完毕 4000检查完毕 4000 对plc发指令 1000对plc发指令
4000 对plc发指令 1000对plc发指令
public partial class Form3 : Form
{
//单机模拟,直接使用内存级缓存,按你的描述来看,我估计是多机多点位,只有这样才可能是
//有那个判定问题,这种我们可以选择Redis进行多机共享缓存
ObjectCache cache = new MemoryCache("test");
public Form3()
{
InitializeComponent();
}
datamake _datamake = new datamake();
private void Form3_Load(object sender, EventArgs e)
{
_datamake.DataEvent += _datamake_DataEvent;
Task.Run(async () =>
{
foreach (var context in quque.GetConsumingEnumerable())
{
await context.sendplc();
}
});
}
BlockingCollection<Context> quque = new BlockingCollection<Context>(200);
private void _datamake_DataEvent(KeyValuePair<DateTime, int> obj)
{
var context = new Context();
context.value = obj.Value;
context.date = obj.Key;
context.handler();
quque.Add(context);
}
//先做一个你那个事件产生的模拟器
public class datamake
{
public event Action<KeyValuePair<DateTime, int>> DataEvent;
public void startMake()
{
Random rand = new Random(DateTime.Now.Millisecond);
Task.Run(async () =>
{
while (true)
{
//随机产生一个数
int value = rand.Next(1, 4000);
DataEvent?.BeginInvoke(new KeyValuePair<DateTime, int>(DateTime.Now, value), null, null);
await Task.Delay(TimeSpan.FromMilliseconds(300)); //大概每秒3次
}
});
}
}
public class Context
{
public DateTime date { get; set; }
public int value { get; set; }
/// <summary>
/// 数据预处理任务
/// </summary>
private Task pretask;
public Task handler()
{
return pretask = Task.Run(async () =>
{
await get条码();
await 检查条码();
});
}
private Task get条码()
{
Task.Yield();
return Task.CompletedTask;
}
private async Task 检查条码()
{
Task.Yield();
await Task.Delay(this.value);
// return Task.CompletedTask;
}
public async Task sendplc()
{
//等待数据预处理完毕
await pretask;
Trace.WriteLine(this.value);
//do send plc;
}
}
private void button1_Click(object sender, EventArgs e)
{
//测试sendplc执行顺序
var context = new Context();
context.value = 4000;
context.date = DateTime.Now; ;
context.handler();
quque.Add(context);
var context2 = new Context();
context2.value = 1000;
context2.date = DateTime.Now; ;
context2.handler();
quque.Add(context2);
}
private void button2_Click(object sender, EventArgs e)
{
_datamake.startMake();
}
}
还是要跟踪测试,确保代码切实完整执行了,还是说执行过程中有异常存在