C# 线程 和 委托的使用

低调的感觉 2013-08-29 09:27:26
demo 1:

//Class A:

/// <summary>
/// 监听消息(广播和聊天)
/// </summary>
private ClientSocket _ClientSocket;
/// <summary>
/// 启动Socket(开辟线程)
/// </summary>
private void SocketStartThread()
{
Thread thread = new Thread(new ThreadStart(SocketStart));
thread.IsBackground = true;
thread.Start();
}
/// <summary>
/// 启动Socket
/// </summary>
private void SocketStart()
{
//监听消息(广播和聊天)
_ClientSocket = new ClientSocket(_LabelMsg);
_ClientSocket.StartUdpThread();
}

demo 2:
//Class A:
/// <summary>
/// 监听消息(广播和聊天)
/// </summary>
private ClientSocket _ClientSocket;
/// <summary>
/// 声明委托
/// </summary>
/// <param name="?"></param>
private delegate void _DelegateSocke();
/// <summary>
/// 启动Socket(开辟线程)
/// </summary>
private void SocketStartThread()
{
Thread thread = new Thread(new ThreadStart(SocketStartInvoke));
thread.IsBackground = true;
thread.Start();
}
/// <summary>
/// 启动Socket(委托)
/// </summary>
private void SocketStartInvoke()
{
this.Invoke(new _DelegateSocke(SocketStart));
}
/// <summary>
/// 启动Socket
/// </summary>
private void SocketStart()
{
//监听消息(广播和聊天)
_ClientSocket = new ClientSocket(_LabelMsg);
_ClientSocket.StartUdpThread();
}


demo1:
运行正常,但是我在【_ClientSocket.StartUdpThread();】这个方法里执行ClassA里的一个事件时就报错了:“在某个线程上创建的控件不能成为在另一个线程上创建的控件的父级

网上查了资料后,可能需要用到委托,于是将代码改成demo2:
可是demo2运行后,程序就直接卡住了。。。

怎么解决???
...全文
300 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
低调的感觉 2013-08-30
  • 打赏
  • 举报
回复
是在【_ClientSocket.StartUdpThread();】这个方法里卡住了, 但是我是新开辟的一个线程去执行的这个方法,主线程应该不会卡吧 我不用委托的话,主线程运行是正常的,但是使用委托后,主线程也卡住了
tcmakebest 2013-08-29
  • 打赏
  • 举报
回复
事件在哪里,根本看不到,大概在 ClientSocket 里
低调的感觉 2013-08-29
  • 打赏
  • 举报
回复
引用 1 楼 tcmakebest 的回复:
应该把调用事件的单个语句放到 Invoke 中,而不是把整个线程用 Invoke 执行,因为这样就没必要用线程了。
你说的应该是这么写吧:
/// <summary>
/// 启动Socket(委托)
/// </summary>
private void SocketStartInvoke()
{
    //监听消息(广播和聊天)
    _ClientSocket = new ClientSocket(_LabelMsg);
    this.Invoke((_DelegateSocket)delegate() { _ClientSocket.StartUdpThread(); });
}
依然是卡住了!
低调的感觉 2013-08-29
  • 打赏
  • 举报
回复
不要沉了,请高手帮我解决下!
tcmakebest 2013-08-29
  • 打赏
  • 举报
回复
应该把调用事件的单个语句放到 Invoke 中,而不是把整个线程用 Invoke 执行,因为这样就没必要用线程了。
明缘 2013-08-29
  • 打赏
  • 举报
回复
可以打印些Log出来,看看在哪里卡住的。
  • 打赏
  • 举报
回复
执行事件触发的代码贴出来看看呗
鲫瓜子 2013-08-29
  • 打赏
  • 举报
回复
Control.CheckForIllegalCrossThreadCalls = false;

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧