C# 线程 委托

Gavin_Y 2014-06-25 10:29:30


Thread GetStatus_Thread = new Thread(new ThreadStart(Del_GetStatus));
GetStatus_Thread.IsBackground = true;
GetStatus_Thread.Start();

delegate void delegat_GetStatus();

public void Del_GetStatus()
{
delegat_GetStatus read_B = new delegat_GetStatus(GetStatus);
IAsyncResult result = read_B.BeginInvoke(new AsyncCallback(ACTest), null);

while (!result.IsCompleted)
{
Thread.Sleep(1000);
}
if (result.IsCompleted)
{
Thread.Sleep(1000);
Del_GetStatus();
}
}

public void ACTest(IAsyncResult result)
{
AsyncResult asyncRet=(AsyncResult) result;
delegat_GetStatus dt = (delegat_GetStatus)asyncRet.AsyncDelegate;
dt.EndInvoke(result);
}

public void GetStatus()
{
if (eLogic.Is_Write == false)
{
listStatus.Items.Clear();
Dictionary<string, string> dic = eLogic.eDriver.getDeviceStatus();
foreach (KeyValuePair<string, string> kvp in dic)
{
listStatus.Items.Add(kvp.Key + ":" + kvp.Value);
}
}
if (is_PK == true)
{
if (read_list_Index < eLogic.readInfo_List.Count)
{
for (int i = read_list_Index; i < eLogic.readInfo_List.Count; i++)
{
listReadInfo.Items.Add(eLogic.readInfo_List[i].ToString());
read_list_Index++;
}
}
}
}


各位大侠,现在我用线程调用委托方法时,长时间运行,会出现下图的错误信息。各位帮忙看看是什么问题,谢谢?
...全文
150 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
於黾 2014-06-25
  • 打赏
  • 举报
回复
想无限循环执行记得用while 递归是遍历的时候用的,不是用来让你一直不断重复执行同一个代码的. 你每递归一次,程序就实例化一个新的函数,无限循环内存就溢出了. 不爱用while,你直接goto到函数开始的地方也行啊. 不要让它从最外面再进来一次了.
於黾 2014-06-25
  • 打赏
  • 举报
回复
引用 5 楼 yangpengpeng 的回复:
[quote=引用 4 楼 Z65443344 的回复:] 什么就休眠5秒,休眠一分钟的,都是在干什么啊. 你知道你究竟想干什么吗? 遇到问题先查找问题原因,从根本上解决问题 而不是绕过问题,用一些乱七八糟的手段去规避可能出现的问题
我是想通过线程来循环获取PLC返回的状态信息。[/quote] PLC是什么PLC,开放协议还是需要SDK,还是利用OPC? 不管通信手段用的是什么,你要做的应该是线程循环去通信,然后显示,就这么简单. 用委托不过是线程想对UI操作,没那么复杂. 不会递归就尽量别用,while循环能搞定的问题,用了递归你自己把自己绕进去了.
Gavin_Y 2014-06-25
  • 打赏
  • 举报
回复
引用 4 楼 Z65443344 的回复:
什么就休眠5秒,休眠一分钟的,都是在干什么啊. 你知道你究竟想干什么吗? 遇到问题先查找问题原因,从根本上解决问题 而不是绕过问题,用一些乱七八糟的手段去规避可能出现的问题
我是想通过线程来循环获取PLC返回的状态信息。
於黾 2014-06-25
  • 打赏
  • 举报
回复
什么就休眠5秒,休眠一分钟的,都是在干什么啊. 你知道你究竟想干什么吗? 遇到问题先查找问题原因,从根本上解决问题 而不是绕过问题,用一些乱七八糟的手段去规避可能出现的问题
於黾 2014-06-25
  • 打赏
  • 举报
回复
引用 2 楼 yangpengpeng 的回复:
引用 1 楼 bdmh 的回复:
Del_GetStatus中,在if (result.IsCompleted)时,递归了,造成死循环
要怎么改啊?
按你目前给出的信息,没法改. 因为我们根本不知道你到底想实现什么逻辑. 你得先想好自己要执行什么逻辑,然后用代码实现 而不是随便写出一些乱糟糟的代码,就让别人来改...
Gavin_Y 2014-06-25
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
Del_GetStatus中,在if (result.IsCompleted)时,递归了,造成死循环
要怎么改啊?
bdmh 2014-06-25
  • 打赏
  • 举报
回复
Del_GetStatus中,在if (result.IsCompleted)时,递归了,造成死循环
於黾 2014-06-25
  • 打赏
  • 举报
回复
引用 9 楼 yangpengpeng 的回复:
之前我也用while的,不知道自己怎么想的,想用委托来异步调用,之后就绕进去了。谢谢 @Z65443344
委托异步调用不是这么调用的. 你需要在每次发送完指令,等待数据返回的时候,订阅一个受到数据的事件 这样程序就不用继续等了,有数据返回就开始执行数据处理的逻辑. 处理完再次发送数据,再次订阅事件. 你现在全程sleep,根本是同步阻塞,不管是while循环还是自己调用自己,都是按顺序在跑,没有脱离等待的过程.
Gavin_Y 2014-06-25
  • 打赏
  • 举报
回复
之前我也用while的,不知道自己怎么想的,想用委托来异步调用,之后就绕进去了。谢谢 @Z65443344
Gavin_Y 2014-06-25
  • 打赏
  • 举报
回复
引用 6 楼 Z65443344 的回复:
[quote=引用 5 楼 yangpengpeng 的回复:] [quote=引用 4 楼 Z65443344 的回复:] 什么就休眠5秒,休眠一分钟的,都是在干什么啊. 你知道你究竟想干什么吗? 遇到问题先查找问题原因,从根本上解决问题 而不是绕过问题,用一些乱七八糟的手段去规避可能出现的问题
我是想通过线程来循环获取PLC返回的状态信息。[/quote] PLC是什么PLC,开放协议还是需要SDK,还是利用OPC? 不管通信手段用的是什么,你要做的应该是线程循环去通信,然后显示,就这么简单. 用委托不过是线程想对UI操作,没那么复杂. 不会递归就尽量别用,while循环能搞定的问题,用了递归你自己把自己绕进去了.[/quote] 嗯,你说的有道理,我确实把一个简单的问题复杂化了。

110,566

社区成员

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

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

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