C#多线程项目实用问题

Balla_c 2020-07-27 04:23:31
对多线程仅限于定义上的了解,,目前在做一个机器人抓取传送带上物体的上位机,涉及到传送带运动、物体位姿处理、抓取位置计算、机器人控制等几个模块,如何用多线程控制几个模块有序运行呢?,,就是说怎么能用多线程做到一得到处理后的信息,立刻计算;一计算出结果,立刻抓取;一抓取完成,立刻抓取下一个。。。类似这种功能实习,,叙述的有点多,望大神赐教,特别感激!
...全文
2687 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
Balla_c 2020-07-28
  • 打赏
  • 举报
回复
引用 18 楼 以专业开发人员为伍的回复:
.net 本身就是一个高效率的系统框架,但是也有很多早先很多年的所谓开源框架,用复杂的代码和学习,来实现 .net 一两行代码的功能。所以这个要注意,要学好 .net,把精力放到底层和高层的你们自己公司“原创”系统设计上,不要把精力放到浪费时间的培训班常用的框架上。
我好像理解了,太感谢您了,代码易懂,,我正在看一本《C#多线程开发之并发编程》,正好看到await,,之前从没用过并发,又打开了一块新大陆,,谢谢您耐心的回复
wanghui0380 2020-07-28
  • 打赏
  • 举报
回复
既然是状态跟踪,你需要也是建立状态描述 物体检查------------存在物体----判定是否已建立状态--------如果已经建立状态,更新运动状态,位置信息。如果未建立状态,新建状态并加入物体状态队列(物体状态-等待抓取) 机器人控制------------------订阅物体状态队列,没有队列异步等着,有队列取到一个,进行抓取控制(更新物体控制状态为正在抓取中),异步等待控制状态结果(成功还是失败) so设计结果是 公用上下文: 线程安全队列 --- 物体队列 当前控制物体 后台服务: 1. 判定物体服务-------------查找物体,判定物体存在,判定物体是否为同一物体,跟踪物体运动状态,更新物体位置信息 2.抓取服务------------从公用队列获取一个物体,设置为当前控制物体。启动异步抓取任务,等待抓取结果,重复整个过程
  • 打赏
  • 举报
回复
.net 本身就是一个高效率的系统框架,但是也有很多早先很多年的所谓开源框架,用复杂的代码和学习,来实现 .net 一两行代码的功能。所以这个要注意,要学好 .net,把精力放到底层和高层的你们自己公司“原创”系统设计上,不要把精力放到浪费时间的培训班常用的框架上。
  • 打赏
  • 举报
回复
举个例子来说,同步方法代码可能是写
ResType 处理接收到的消息(接收消息包 data)
{
var r1 = 开始计算(data);
var res = 开始抓取(result);
return res;
}


而5、6年前的异步代码可能是写
void 处理接收到的消息(接收消息包 data, Action<ResType> callback)
{
ThreadPool.QueueUserWorkItem(h => //调用 .net 线程池自动管理一个任务(匿名委托任务)
{
var result = 开始计算(data);
ThreadPool.QueueUserWorkItem(k => //调用 .net 线程池自动管理一个任务(匿名委托任务)
{
开始抓取(result, callback); //异步任务完成,回调通过参数传来的 Action
});
});
}

而最近几年的写法是写
async Task<ResType> 处理接收到的消息(接收消息包 data)
{
var result = await 开始计算(data); //调用 .net task 自动管理一个异步任务
return await 开始抓取(result); //调用 .net task 自动管理另一个异步任务
}


现在的语法简洁了,但是异步的概念其实没变。也就是说,你顺序操作是 A->B->C,改为异步多线程就是使用 .net 系统的高效率的任务管理机制来调用 B 和 C,并且不等任务结束(甚至不等任务开始)就可以立刻返回 A 和 B 方法。
  • 打赏
  • 举报
回复
引用 楼主 Balla_c 的回复:
就是说怎么能用多线程做到一得到处理后的信息,立刻计算;一计算出结果,立刻抓取;一抓取完成,立刻抓取下一个。。。类似这种功能实习,,叙述的有点多,望大神赐教,特别感激!


你写的就是普通的方法调用,不外乎区分为同步方法和异步方法,而已。
Balla_c 2020-07-28
  • 打赏
  • 举报
回复
引用 13 楼 圣殿骑士18 的回复:
Rx对你或许有用 https://github.com/dotnet/reactive
好哒,我看一下哈,谢谢您。
圣殿骑士18 2020-07-28
  • 打赏
  • 举报
回复
https://www.jianshu.com/p/328a1cc5eddc
圣殿骑士18 2020-07-28
  • 打赏
  • 举报
回复
Rx对你或许有用 https://github.com/dotnet/reactive
Balla_c 2020-07-28
  • 打赏
  • 举报
回复
引用 11 楼 不胖到130不改名字的回复:
虽然我没做过上位机程序,
引用
一得到处理后的信息,立刻计算;一计算出结果,立刻抓取;一抓取完成,立刻抓取下一个
但是看你说的,好像就是同步,有什么用线程的必要吗?
不是同步,我描述的只是一个整体过程,但是实际应用中各部分都在运行自己的工作,而且有个时间上的协调
  • 打赏
  • 举报
回复
虽然我没做过上位机程序,
引用
一得到处理后的信息,立刻计算;一计算出结果,立刻抓取;一抓取完成,立刻抓取下一个
但是看你说的,好像就是同步,有什么用线程的必要吗?
Balla_c 2020-07-28
  • 打赏
  • 举报
回复
引用 8 楼 wanghui0380的回复:
既然是状态跟踪,你需要也是建立状态描述 物体检查------------存在物体----判定是否已建立状态--------如果已经建立状态,更新运动状态,位置信息。如果未建立状态,新建状态并加入物体状态队列(物体状态-等待抓取) 机器人控制------------------订阅物体状态队列,没有队列异步等着,有队列取到一个,进行抓取控制(更新物体控制状态为正在抓取中),异步等待控制状态结果(成功还是失败) so设计结果是 公用上下文: 线程安全队列 --- 物体队列 当前控制物体 后台服务: 1. 判定物体服务-------------查找物体,判定物体存在,判定物体是否为同一物体,跟踪物体运动状态,更新物体位置信息 2.抓取服务------------从公用队列获取一个物体,设置为当前控制物体。启动异步抓取任务,等待抓取结果,重复整个过程
好哒,谢谢您,讲的很详细了,我再学习一下,谢谢(*°∀°)=3
Balla_c 2020-07-27
  • 打赏
  • 举报
回复
引用 6 楼 wanghui0380的回复:
这也是Ros这种系统核心从来就没放在线程上,他的核心设计是Node节点,是消息,是dataflow数据流,是状态机原因
对的,是并行
wanghui0380 2020-07-27
  • 打赏
  • 举报
回复
这也是Ros这种系统核心从来就没放在线程上,他的核心设计是Node节点,是消息,是dataflow数据流,是状态机原因
wanghui0380 2020-07-27
  • 打赏
  • 举报
回复
不要管线程不线程,这个玩意你要一头栽进线程就算进了坑了,想爬出来就----,这里已经无数次证明看见钉子就想“线程”锤子的,100%会进坑,100%会砸到自己的手 这种东西第一步是写context,因为你要的不是什么线程,而是“跟踪执行状态”,执行动作可以并行/并发,但核心是状态而不是线程
Balla_c 2020-07-27
  • 打赏
  • 举报
回复
没接触过ros,,然后上面提到的几个模块都已经完成了,用的ABB机器人,在Robotstudio中模拟仿真,,,现在是希望把几部分整合到一起,,如果再学ros的话可能会花费更多时间,,,非常感谢您的宝贵建议!
wanghui0380 2020-07-27
  • 打赏
  • 举报
回复
另外用Ros也是告诉你实际项目,从来就没人跟这里一样天天折腾所谓线程,以为线程如何如何伟大。 哪怕Ros这样的项目也是使用消息,队列,pipline去做隔离,而不是没日没夜的折腾线程
wanghui0380 2020-07-27
  • 打赏
  • 举报
回复
ROS中控制机械臂抓取目标例程 https://blog.csdn.net/zzu_seu/article/details/91347757
wanghui0380 2020-07-27
  • 打赏
  • 举报
回复
个人建议直接用Ross把 倒不是俺们说又让你用新东西,主要是Ross可以模拟测试。有模拟环境,总比你啥都没有光凭嘴说要实际
《Visual C#2008开发经验与技巧宝典》及其配套光盘使用完整的源代码列举了800余条实用性极强的针对网站设计人员和数据库开发人员的Visual C# 2008编程技巧,旨在帮助广大读者快速解决实际开发过程中面临的诸多问题,从而提高程序开发效率、拓展软件应用领域。全书内容涵盖了大量的Visual C#2008编程新技术和新理念,包括LINQ在SQL、Data Set、XML和Object等领域的实际应用,WPF动画界面设计,WCF多层数据架构通信、泛型应用、XML文件处理、多线程管理、程序异常拦截、文件压缩及解压缩、文件加密和解密、文件访问权限、API函数调用、指针调用、数据更新并发冲突处理、数据批量导入导出、Web服务、MS Report Viewer报表开发、水晶报表设计、母版页、主题及皮肤、导航菜单、成员资格、角色管理、缓存策略、Web Parts、Grid View和List View个性化定制、AJAX局部页面刷新方案以及大量的异步调用编程技巧等。为了突出编程技巧的实用性和简洁性,《Visual C#2008开发经验与技巧宝典》在演示或描述编程技巧时,力求针对性地解决问题,尽量减少和避免问题的复杂化。由于篇幅限制,《Visual C#2008开发经验与技巧宝典》文字部分只给出与此技巧密切相关的关键代码,完整的源代码请参考配套光盘。《Visual C#2008开发经验与技巧宝典》最适于用作网站设计人员和数据库开发人员使用Visual C# 2008开发项目的案头参考书,无论是编程初学者还是编程高手,《Visual C#2008开发经验与技巧宝典》都极具参考和收藏价值。

110,526

社区成员

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

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

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