您的位置:首页 > 其它

关于在窗体中使用多线程调用控件的方式

2011-12-15 15:08 381 查看
小弟之前在窗体的多线程内调用控件,使用:

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;


这条语句,网上好像都不建议这么使用,唉,本人用这种方式调试程序也报错,实在没辙,就采用了另外一种网上认为稍微优化点儿的方式,如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Threading;
namespace WindowsApplication2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
Thread threadGet1, threadGet2;

threadGet1 = new Thread(new ThreadStart(doGetFromXml1));

threadGet2 = new Thread(new ThreadStart(doGetFromXml2));

threadGet1.Start();
threadGet2.Start();

}

object sysobj = new Object();

public void doGetFromXml1()
{

while (true)
{
lock (sysobj)
{
ShowMessage("oooo\r\n");
}
}

}

public void doGetFromXml2()
{

while (true)
{

lock (sysobj)
{
ShowMessage("aaaa\r\n");
}
}

}

delegate void ShowMess(String s);
void ShowMessage(string s)
{
if (this.richTextBox1.InvokeRequired == true)
{
this.richTextBox1.Invoke(new ShowMess(ShowMessage),new object[]{s});
}
else
{
this.richTextBox1.Text = s;
}
}
}
}


以上是摘自CSDN论坛上的,本人小可耻了一下,以下是本人自己的代码:

#region 属性、变量
Thread th = null;
object sysobj = new Object();
delegate void Binding();
#endregion

#region 构造函数
public frmUserStateQuery()
{
InitializeComponent();
//System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;
th = new Thread(new ThreadStart(ThreadMethod));
th.Start();
}
#endregion

#region 数据绑定
/// <summary>
/// 表格控件绑定
/// </summary>
void GridBinding()
{
using (DoubleStarDataContext db = Program.GetDB())
{
if (gridControl1.InvokeRequired)
{
gridControl1.Invoke(new Binding(GridBinding));
}
else
{
gridControl1.DataSource = db.VW_UserState.OrderBy(p => p.DeptName).OrderBy(p => p.UserName).OrderBy(p => p.TableID).OrderBy(p => p.BillID).OrderBy(p => p.HandBillID).OrderBy(p => p.Goods).OrderBy(p => p.ProcedureName).OrderBy(p => p.Rest).OrderBy(p => p.Work).OrderBy(p => p.UnUsed);
gridView1.BestFitColumns();
}
}
}
#endregion

#region 私有方法
public void ThreadMethod()
{
while (true)
{
lock (sysobj)
{
GridBinding();
//休眠
Thread.Sleep(5000);
}
}
}
#endregion
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐