private void Form1_Load(object sender, EventArgs e)
{
//多线程
AAA= new Thread(new ThreadStart(BBB));
AAA.Start();
}
//接收数据方法
public void BBB()
{
while (true)
{
IPEndPoint IpSender = new IPEndPoint(IPAddress.Any, 0);
EndPoint tmpRemote = (EndPoint)IpSender; byte[] recive = new byte[1024];
try
{
int recv = bacnet_master_socket.ReceiveFrom(recive, ref tmpRemote);
}
catch (Exception efe)
{
label1.Text = efe.ToString();
}
}
}
我应该怎样写才能把错误信息显示到label1中呢?
希望高手指点!!
感激不尽!!!!!
解决方案 »
- 关于C# lock关键字的疑问
- [C#初级问题]关于类中非方法中不能使用this问题.
- 如何控制OpenFileDialog控件只查看图片文件?
- 在线请教,关于ACTIVE控件,无法加载图片问题
- 请高手帮忙 怎么把断电跟踪到属性内部 ?
- ^2006^开源:VS.NET打印思想与DataGrid、VS2005DataGridView及二维数据如ListView等终极打印实现(全部源码)
- c#程序员薪水大揭秘!!!!!!!!!
- 急,水晶报表不能打印放在页脚最底下的字段,预览可以看到这个字段的(大约在A4纸最底下2厘米的范围),但是A4就是打印不出来啊,能解决
- 用vs.net如何做自定义选项安装盘?
- C#如何用结构体直接读取二进制文件的内容
- ASP.NET 如何动态输出html标签内容
- 【求助】Socket
{
InitializeComponent();
Control.CheckForIllegalCrossThreadCalls = false;//加入这句话,不过治标不治本
}2.使用委托(根据你的程序创建委托)
{
label1.Text = efe.ToString();
}
//{
label1.Text = efe.ToString();
//}
//改成
catch (Exception efe)
{
setLabel(efe.ToString());
}//setLabel方法及委托
delegate void delegateSetLabel(string str);
void setLabel(string str)
{
if (this.InvokeRequired)
{
Invoke(new delegateSetLabel(setLabel), new object[] { str });
}
else
{ label1.Text = efe.ToString();
}
}
上面的错了
private delegate void MyDelegateUI();
if (label1.InvokeRequired)
{
MyDelegateUI d = delegate
{
label1.Text = efe.ToString();
};
label1.Invoke(d);
}
else
{
label1.Text = efe.ToString();
}
MyDele del;
private void button1_Click(object sender, EventArgs e)
{
del=new MyDele(BBB);
del.Invoke();
}
public void BBB()
{
while (true)
{
button1.Text = DateTime.Now.ToString();
Application.DoEvents();
}
}
控件的invoke函数操作实列请看
http://msdn.microsoft.com/zh-cn/library/zyzhdc6b(v=VS.80).aspx
获取一个值,该值指示调用方在对控件进行方法调用时是否必须调用 Invoke 方法,因为调用方位于创建控件所在的线程以外的线程中。我查过英文版的注释,无论是中文的还是英文的,都强调了一点,就是说控件只能在创建此控件的线程上才能被调用。但是实际上却不是这样子的。正确地说,这里有两个概念,即创建控件的线程和拥有控件的线程。关于"拥有"这个词,这里只是我自己YY出来的,但愿能说明问题,后面还有更多的解释。创建控件的线程很好理解,那什么是拥有控件的线程呢。两者是一样的吗?不一样。拥有控件的线程。我这里指的应该是创建了此控件handle的线程,而不是创建控件本身的那个线程。两者可以是相同的,也可以是不同的。那线程怎么样创建一个控件的handle呢?很简单,我们还是先看看MSDN对Handle的说明。Control.Handle 属性获取控件绑定到的窗口句柄。
备注
Handle 属性的值是 Windows HWND。如果句柄尚未创建,引用该属性将强制创建句柄。在实际中,当一个控件被创建出来后,它的Handle是还没有被创建的,只有当第一次引用了该发生之后,才会被创建。
很多时候写windows程序都需要结合多线程,经常会跨线程操作控件,这时就会出错,提示不允许"从不是创建控件的进程访问它"。这个时候的解决思路:把想对另一线程中的控件实施的操作放到一个函数中,然后使用delegate代理那个函数,并且在那个函数中加入一个判断,用InvokeRequired来判断调用这个函数的线程是否和控件线程在同一线程中,如果是则直接执行对控件的操作,否则利用控件的Invoke或BeginInvoke方法来执行这个代理,执行唤醒控件的操作。
Invoke的中文解释是唤醒,它有两种参数类型 (Delegate, Object[])和(Delegate)
Delegate就是前面提到的那个代理,而Object[]则是用来存放Delegate所代理函数的参数
delegate void aa();//定义代理private void CtlInvoke()
{
if (label1.InvokeRequired)//判断是否需要唤醒操作(当前线程与控件是否属于一个线程,否就执行唤醒,是就执行方法)
{
aa a1 = new aa(label1);//执行代理
label1.Invoke(a1);//执行唤醒操作
}
else
{
return;
}
}