经了解:C#消息机制是消息流水线响应机,不能同时进行。
C# 数据更新是在Timer,分析:可能是在进行time任务时,不能进行invoke接收任务。之后我打算开个多线程试试或把接收中处理精简看看能不能收到。(该分析错误的)
private void Form1_Load(object sender, EventArgs e)
{
........
//定时器
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
aTimer.Interval = 3;
aTimer.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
aTimer.Enabled = true; //是否执行System.Timers.Timer.Elapsed事件;
..........
}
void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
ComStatusdeal();
}
//接收在
sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
public void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
System.Threading.Thread.Sleep(50);//延时50ms完全接收数据
//this.Invoke跨线程访问,辅助线程访问主线程控件
this.Invoke((EventHandler)(delegate
{
tc.DataReceived_485();
}));
}
事后几个月发现写了个错误的文章今日2020/09/15更正:之所以接受不多是因为Time定时器timer_Elapsed同时进入了多次,每一次我接受到数据就进入timer_Elapsed处理,这里的处理有些UI更新比较耗时,导致当前未处理完,就再次进入timer_Elapsed,出现重入问题。
解决:使用线程同步技术 互斥
public Form1()
{
InitializeComponent();
CheckForIllegalCrossThreadCalls = false;
Interlocked.Exchange(ref inTimer, 0);//每次初始化为0
this.SetStyle(ControlStyles.UserPaint, true);//自动绘制
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);//减少闪烁
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);//减少闪烁
this.SetStyle(ControlStyles.DoubleBuffer, true);//减少闪烁
this.SetStyle(ControlStyles.ResizeRedraw, true);//重绘控件
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);//减少闪烁
}
private static int inTimer = 0;
private void Timer_Elapsed(object sender, EventArgs e)
{
//使用线程同步技术 互斥
if (Interlocked.Exchange(ref inTimer, 1) == 0)
{
....
....
Interlocked.Exchange(ref inTimer, 0);
}
//DateTime afterDT = System.DateTime.Now;
//TimeSpan ts = afterDT.Subtract(beforeDT);
//System.Diagnostics.Debug.WriteLine(ts.TotalMilliseconds);
}