private System.Timers.Timer _timer = new System.Timers.Timer();
public void PrintData(MessageEntity mess)
{
try
{
//this.dgvMessage.
// int a = dgvMessage.Rows.Count;
int maxRows = 2000;//配置文件可设置
CheckForIllegalCrossThreadCalls = false; if (dgvSend.Rows.Count < maxRows)
{ dgvSend.Rows.Insert(0, 1);
}
else
{
dgvSend.Rows.RemoveAt(maxRows - 1);
dgvSend.Rows.Insert(0, 1);
}
//this.dgvMessage.Rows.Add(string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty);
//dgvMessage.CurrentCell = dgvMessage.Rows[0].Cells[0];
//this.dgvMessage.Rows[0].Cells[0].Value = RowNumberA;
dgvSend.Rows[0].Cells[0].Value = mess.RowTypeA;
dgvSend.Rows[0].Cells[1].Value = mess.BankNumber;
dgvSend.Rows[0].Cells[2].Value = mess.Describe;
dgvSend.Rows[0].Cells[3].Value = mess.TakeData;
dgvSend.Rows[0].Cells[4].Value = mess.InOrTo;
dgvSend.Rows[0].Cells[5].Value = mess.FileName;
}
catch (Exception ex)
{
}
}
/// <summary>
/// 定时操作的具体内容
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void ReadAttendanceData(object sender, ElapsedEventArgs e)
{
_timer.Stop();
SendReportOpera();
_timer.Start();
}
/// <summary>
/// 设置定时启动
/// </summary>
/// <param name="timePart">每隔多久执行</param>
protected void SetVariable(int timePart)
{
// _timer = new System.Timers.Timer();
_timer.Elapsed += new ElapsedEventHandler(ReadAttendanceData);
_timer.Interval = timePart;
_timer.Enabled = true;
_timer.AutoReset = true;
_timer.Start();
}
private void SendReportOpera()
{
DataSet ds = xmlh.ConvertXMLFileToDataSet();
DataTable dt = ds.Tables[0];
int jieguo = -1;
for(int i=0;i<dt.Rows.Count;i++)
{
MessageEntity mes = new MessageEntity();
int result = srMan.InsertDBBySend(dt.Rows[i]["BRANCHID"].ToString(), oper, out mes);
loge.LogEvent(mes);
PrintData(mes);
MessageEntity mess = new MessageEntity();
ds = srMan.GetDataByBranchId(dt.Rows[i]["BRANCHID"].ToString(), oper, out mess, out jieguo);
loge.LogEvent(mess);
PrintData(mess);
if (jieguo == 0)
{
MessageEntity mes1 = new MessageEntity();
srMan.InsertDBBySend(dt.Rows[i]["BRANCHID"].ToString(), oper, out mes);
}
//for(int
}
}
这个貌似有别的隐藏问题哦委托不是很熟,大家针对我这个情况,给个具体点的答案,跪求!
private void SendReportOpera()
{
DataSet ds = xmlh.ConvertXMLFileToDataSet();
DataTable dt = ds.Tables[0];
int jieguo = -1;
this.BeginInvoke(new Action(() =>
{
for (int i = 0; i < dt.Rows.Count; i++)
{
MessageEntity mes = new MessageEntity();
int result = srMan.InsertDBBySend(dt.Rows[i]["BRANCHID"].ToString(), oper, out mes);
loge.LogEvent(mes);
PrintData(mes);
MessageEntity mess = new MessageEntity();
ds = srMan.GetDataByBranchId(dt.Rows[i]["BRANCHID"].ToString(), oper, out mess, out jieguo);
loge.LogEvent(mess);
PrintData(mess);
if (jieguo == 0)
{
MessageEntity mes1 = new MessageEntity();
srMan.InsertDBBySend(dt.Rows[i]["BRANCHID"].ToString(), oper, out mes);
}
//for(int
}
}));
}要访问UI的时候,必须让代码切入到主线程去执行,这时候就要把代码委托到this.BeginInvoke或者this.Invoke中
Control.CheckForIllegalCrossThreadCalls = false;//"线程间操作无效: 从不是创建控件的线程访问它"解决方法
this.Invoke((MethodInvoker)(() => PrintData(mess)));
控件类型.CheckForIllegalCrossThreadCalls = false或者使用委托。
public void PrintData()
{
if (this.InvokeRequired)
{
delPrintData del = new delPrintData(PrintData);
this.Invoke(del, new object[] { });
}
else
{
//在这里写对控件进行操作的代码
}
}
再说下,在多线程中CheckForIllegalCrossThreadCalls = false
不可随便用,比如说你我这个问题,用了后很容易造成DataGridView假死,滚动条无法使用的情况!