百分问题 C#一个困扰了好几天的问题,winform界面很多控件即时刷新时,界面很卡,已使用BeginInvoke
目前做一个即时监控软件,大数据量接收后,分门别类的传输到winform上的各个控件,显示
winform上大概有40多个控件,主要为 textbox,NI系列的AxCWSlide,AxCWKnob,AxCWGraph
接收端启用一个事件把数据传递到winform端,winform端按照规则分类后传递到各个控件,规则我是在控件的tag内置定的
现在的问题是,数据量大到一定层度时(远远未到要求值),winform界面开始卡,显示开始不正常
我怀疑是UI线程堵塞,处理不过来了,但是又找不到什么好的办法
我以前做C的,这是第一个C#项目,请各位C#大牛多多指点,兄弟先谢谢了
附上部分代码
/////////////
////////前面通过这个事件激活winform这边的处理函数ShowData()
KindsFunction.SendDat += new KindsFunction.SendDatDelegate(ShowData);
/////////////
private delegate void ShowTextDelegate(double[] Dat);
private void ShowData(object Dat)
{
{
if (this.InvokeRequired)
{
double[] data = null;
data = (double[])Dat;//传过来的数据
object[] obj ={ data };
//异步调用委托
this.BeginInvoke(new ShowTextDelegate(ShowText), obj);
}
else
{
//ShowText_short(data_short);
//ShowText_byte(data_byte);
}
}
}
string SubTag;
string GraphType = "array";
//界面上的控件处理
private void ShowText(double[] Dat)
{
try
{
foreach (Control temp in this.Controls)///遍历整个控件
{
if (temp is TextBox)
{
SubTag = temp.Tag.ToString().Substring(5);
if (Dat[0] == Convert.ToDouble(SubTag))////通过当前控件的tag值,与数据中的标示做比较
{
for (int i = 1; i < Dat.Length; i = i + 99)
{
temp.Text = Dat[i].ToString();//写入数据
}
}
}
else if (temp is AxCWUIControlsLib.AxCWSlide)
{
AxCWUIControlsLib.AxCWSlide Slide = (AxCWUIControlsLib.AxCWSlide)temp;
SubTag = Slide.Tag.ToString().Substring(5);
if (Dat[0] == Convert.ToDouble(SubTag))
{
for (int i = 1; i < Dat.Length; i++)
{
Slide.Value = Dat[i];
}
}
}
else if (temp is AxCWUIControlsLib.AxCWKnob)
{
AxCWUIControlsLib.AxCWKnob Knob = (AxCWUIControlsLib.AxCWKnob)temp;
SubTag = Knob.Tag.ToString().Substring(5);
if (Dat[0] == Convert.ToDouble(SubTag))
{
for (int i = 1; i < Dat.Length; i++)
{
Knob.Value = Dat[i];
}
}
}
else if (temp is AxCWUIControlsLib.AxCWGraph)
{
}
}
}
catch { }
}
[DllImport("user32")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam);
private const int WM_SETREDRAW = 0xB;
[DllImport("user32")]
private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, IntPtr lParam);
private const int WM_SETREDRAW = 0xB;