怎样让一个正在运行的线程,立刻去执行一段新代码

黑娃 2017-06-02 10:26:42
问题:线程A是一个正在运行的后台线程(自己创建的,非UI线程),可以认为它在一个死循环里面周而复始的运行着,在某一时刻,我希望这个线程能够“抽空”执行一段“额外的代码”,它不是线程A执行函数中的代码,而是额外添加的一段,并且执行完这段代码之后,线程A能继续执行它原来的函数代码。这种需求就类似于在wpf的后台线程中要去更新UI线程的控件,但只能通过控件的dispatcher去执行更新操作。我就是希望能够对普通线程也这样做,不知道怎么破?
...全文
930 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
黑娃 2017-08-16
  • 打赏
  • 举报
回复
后来我还是用的委托。 25楼说得task Schedule有点意思,空了研究一下,mark
jy251 2017-06-09
  • 打赏
  • 举报
回复
引用 21 楼 falcomavin 的回复:
你这个是普通的线程间的同步嘛
我希望这个线程能够“抽空”执行一段“额外的代码”,它不是线程A执行函数中的代码,而是额外添加的一段,并且执行完这段代码之后,线程A能继续执行它原来的函数代码。这种需求就类似于在wpf的后台线程中要去更新UI线程的控件,但只能通过控件的dispatcher去执行更新操作。我就是希望能够对普通线程也这样做 难道我理解错了?你不就是要在线程A里面运行一个线程B,A挂起,等B运行完毕,A继续?
bloodish 2017-06-05
  • 打赏
  • 举报
回复
引用 24 楼 falcomavin 的回复:
[quote=引用 23 楼 bloodish 的回复:] [quote=引用 20 楼 falcomavin 的回复:] [quote=引用 11 楼 sp1234 的回复:] 看不懂什么叫做“变紧致”。
比如用委托或者开关变量,免不了在成员变量中声明这个东西,在某个地方初始化/赋值/打开,某个地方关闭/置为空,代码稍微显得有一点分散,虽然这些都是很正常的,不过相比较于dispatcher的写法,就显得“不紧致”: { ... btn_test.dispatcher.BeginInvoke(()=>{ // 所有想做的都在这里,不需要分散着写哪怕是一行代码,多紧致嘛 }); ... }[/quote] 楼主,不太明白你的意思了. 你这样用dispatcher跟用委托有什么区别?你如果需要异步,委托同样可以做到[/quote] 区别就在于用委托要事先申明,不用了要置空,还要在目标线程中定期去问这个委托是不是空,如果不空就执行。我想要的效果是目标线程一直在运行,做它该做的事情,而我可以随时叫他停下手里的事情去做另一件我临时安排的事情,做完了它就继续接着做它之前做的事情。委托可以达到这个目的,只是写法没有上面dispatcher那样“紧致”,可以把要做的事情用一块集中的代码说完,而不必事先申明、赋值。我觉得3楼说得很在理,我只是想晓得有没有类似dispathcher这样“紧致”的写法[/quote] 仔细看完需求个人觉得Task Schedule应该能满足你的要求了,看MSDN的说明: An instance of the TaskScheduler class represents a task scheduler. A task scheduler ensures that the work of a task is eventually executed. The default task scheduler is based on the .NET Framework 4 thread pool, which provides work-stealing for load-balancing, thread injection/retirement for maximum throughput, and overall good performance. It should be sufficient for most scenarios. The TaskScheduler class also serves as the extension point for all customizable scheduling logic. This includes mechanisms such as how to schedule a task for execution, and how scheduled tasks should be exposed to debuggers. If you require special functionality, you can create a custom scheduler and enable it for specific tasks or queries. which provides work-stealing for load-balancing //工作窃取或者负载平衡, 你需要的就是工作窃取

 static TaskScheduler workSchedule;
        static void Main(string[] args)
        {
            Task.Factory.StartNew(DoWork);
            //todo...
            if(workSchedule != null)
            {
                Task.Factory.StartNew(DoOtherWork, CancellationToken.None, TaskCreationOptions.None, workSchedule);
            }            
        }
        static void DoOtherWork()
        {
            //todo
        }
        static void DoWork() 
        {
            workSchedule = TaskScheduler.FromCurrentSynchronizationContext();
            //todo
        }
黑娃 2017-06-05
  • 打赏
  • 举报
回复
引用 23 楼 bloodish 的回复:
[quote=引用 20 楼 falcomavin 的回复:] [quote=引用 11 楼 sp1234 的回复:] 看不懂什么叫做“变紧致”。
比如用委托或者开关变量,免不了在成员变量中声明这个东西,在某个地方初始化/赋值/打开,某个地方关闭/置为空,代码稍微显得有一点分散,虽然这些都是很正常的,不过相比较于dispatcher的写法,就显得“不紧致”: { ... btn_test.dispatcher.BeginInvoke(()=>{ // 所有想做的都在这里,不需要分散着写哪怕是一行代码,多紧致嘛 }); ... }[/quote] 楼主,不太明白你的意思了. 你这样用dispatcher跟用委托有什么区别?你如果需要异步,委托同样可以做到[/quote] 区别就在于用委托要事先申明,不用了要置空,还要在目标线程中定期去问这个委托是不是空,如果不空就执行。我想要的效果是目标线程一直在运行,做它该做的事情,而我可以随时叫他停下手里的事情去做另一件我临时安排的事情,做完了它就继续接着做它之前做的事情。委托可以达到这个目的,只是写法没有上面dispatcher那样“紧致”,可以把要做的事情用一块集中的代码说完,而不必事先申明、赋值。我觉得3楼说得很在理,我只是想晓得有没有类似dispathcher这样“紧致”的写法
bloodish 2017-06-05
  • 打赏
  • 举报
回复
引用 20 楼 falcomavin 的回复:
[quote=引用 11 楼 sp1234 的回复:] 看不懂什么叫做“变紧致”。
比如用委托或者开关变量,免不了在成员变量中声明这个东西,在某个地方初始化/赋值/打开,某个地方关闭/置为空,代码稍微显得有一点分散,虽然这些都是很正常的,不过相比较于dispatcher的写法,就显得“不紧致”: { ... btn_test.dispatcher.BeginInvoke(()=>{ // 所有想做的都在这里,不需要分散着写哪怕是一行代码,多紧致嘛 }); ... }[/quote] 楼主,不太明白你的意思了. 你这样用dispatcher跟用委托有什么区别?你如果需要异步,委托同样可以做到
黑娃 2017-06-05
  • 打赏
  • 举报
回复
引用 13 楼 sp1234 的回复:
“怕有什么便捷方法是自己不知道的”这个是很损害软件设计专业精神的说法。在设计时,不做多余的设计,实际上一个设计能不能深入在于你自己的描述,设计本身不是免费的共享汽车一样随便扔大街上的,而都是要根据你的详细描述的能力才来发现出来。
再专业也存在自己不知道的事情,对客户或是一些不友善的外行我肯定不会这样说,不过在同行的论坛上面,我还是谦虚一点好。
黑娃 2017-06-05
  • 打赏
  • 举报
回复
引用 7 楼 jy251 的回复:
举例: 一个线程函数proc,调用另外一个线程函数proc1 autoresetevent are = new autoresetevent (false); void proc() { ...... Action action = proc1; action.beginInvoke(); are.waitone(); .......... } void proce1() { ...... are.release(); }
你这个是普通的线程间的同步嘛
黑娃 2017-06-05
  • 打赏
  • 举报
回复
引用 11 楼 sp1234 的回复:
看不懂什么叫做“变紧致”。
比如用委托或者开关变量,免不了在成员变量中声明这个东西,在某个地方初始化/赋值/打开,某个地方关闭/置为空,代码稍微显得有一点分散,虽然这些都是很正常的,不过相比较于dispatcher的写法,就显得“不紧致”: { ... btn_test.dispatcher.BeginInvoke(()=>{ // 所有想做的都在这里,不需要分散着写哪怕是一行代码,多紧致嘛 }); ... }
绿领巾童鞋 2017-06-05
  • 打赏
  • 举报
回复
这不就两个线程 控制 ,触发条件的时候 ,一个线程 中止,一个线程启动。。。
  • 打赏
  • 举报
回复
考虑让该线程睡眠一段时间,在这段时间执行另外的线程
ilikeff8 2017-06-03
  • 打赏
  • 举报
回复
如果你要这个线程自己控制,是肯定要线程内部的“额外”代码的
ilikeff8 2017-06-03
  • 打赏
  • 举报
回复
挂起线程,执行其他,再恢复线程
  • 打赏
  • 举报
回复
“怕有什么便捷方法是自己不知道的”这个是很损害软件设计专业精神的说法。在设计时,不做多余的设计,实际上一个设计能不能深入在于你自己的描述,设计本身不是免费的共享汽车一样随便扔大街上的,而都是要根据你的详细描述的能力才来发现出来。
  • 打赏
  • 举报
回复
这里柑橘就是“套取”各种说法,但是自己事先贴不出来什么系统设计。如果你对于委托、事件的规范设计都以“不够紧致”为断言,而又贴不出来“紧致”的可操作的标准,那其实不是一个技术问题。
  • 打赏
  • 举报
回复
看不懂什么叫做“变紧致”。
秋的红果实 2017-06-03
  • 打赏
  • 举报
回复
同时开另一个线程处理,中断一个,处理完,再接着执行,有难度 还要看你当前线程具体在做什么,如果是读一个大文件(1w行),当写到5K行时停下执行其他代码,可以记录已读行数,执行完其他代码,根据记录的已读行数,接着读取 你不如,在读取大文件的同时,再开启一个新的线程去执行你另外的代码
xuzuning 2017-06-03
  • 打赏
  • 举报
回复
你这个得用事件响应机制 windows 本身是 消息驱动 C# 将其包装成 事件驱动 有人发出事件,有人订阅事件并处理 而发出事件的人并不知道(也不需要知道)是谁在处理 但依然有很多人习惯于过程化编程,什么都要看得见,不放心别人的工作 编程 从 个体劳动 到 工业化 生产,关键就在于这个理念的转变
ljheee 2017-06-03
  • 打赏
  • 举报
回复
干嘛非要在这个线程执行,触发另外一个线程不行吗
xuggzu 2017-06-02
  • 打赏
  • 举报
回复
这个线程无直接关系吧,一个过程中的代码都需要顺序执行,想可控跳转要不条件跳,要不就异常跳,否则是无法控制的。
wpf更新绑定数据到UI也是需要通知的,说白了就是条件跳转。至于怎么看起来"高端大气",也只是层层包装的结果。
另外就是楼主要求的跳转,其实还有及时程度问题,就算搞个变量去控制跳,也得等到执行到判断才行。更不用说线程的时间不可控性了。
  • 打赏
  • 举报
回复
dispatcher 是通过委托来实现的,你如果要实现类似的效果,也可以使用委托。你将要执行的“额外”代码赋给定义好的一个委托,然后在A中根据需要调用这个委托。
加载更多回复(7)
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 SolidWorks是一款在机械设计领域得到广泛应用的计算机辅助设计(CAD)软件,它具备功能强大的三维建模工具、完善的工程图功能以及多样化的设计协作功能。在工程图模板方面,SolidWorks为设计师们提供了创建符合行业标准图纸的便捷途径,从而显著提升了设计工作的效率。标题"SolidWorks工程图模板"具体指的是在SolidWorks软件中预先设定好的图框与标题栏组合布局,这些模板通常依据特定的规范(例如ISO、ANSI等)进行配置,涵盖了设计者通常所需的所有基本要素。借助这些模板,用户能够直接展开工程图的绘制工作,无需独立设置图框和标题栏,因而有效节省了大量的时间。描述中所指出的"已配置好图框和标题栏",表明这些模板已具备绘制工程图的基础结构。图框作为工程图的一个核心组成部分,它界定了图纸的范围,并且通常包含了图纸编号、日期、比例等关键信息。标题栏则是用于呈现设计详细信息的区域,例如设计者的姓名、零件的名称、材料种类、版本号等。一旦这些要素被配置妥当,设计师便可以根据具体的项目需求填充相应内容,从而迅速生成专业且标准化的工程图纸。"配置好存储路径后即可使用"这一说明表明,在使用SolidWorks工程图模板之前,用户必须先设定一个保存位置,这样每次创建的工程图时,软件会自动将文件保存在这个指定的路径下,便于后续的管理和检索。压缩包内包含的文件"A3零件.DRWDOT"与"A3零件.slddrt"代表了SolidWorks的两种不同类型的工程图文件。".DRWDOT"文件是工程图模板文件,它集成了图框、标题栏及其他个性化设置,供用户在创建工程图时选用。".slddr...
内容概要:本文介绍了一个名为GeometryService的类,旨在将不同类型的地理空间数据(如点坐标、Shapefile文件、GADM行政区划数据)解析并转换为Google Earth Engine可识别的几何对象(ee.Geometry)。该服务支持三种输入类型:通过经纬度字典创建点几何体、读取本地矢量文件(如Shapefile或GeoJSON)以及调用pygadm库获取全球行政区划数据。每种类型均有专门的解析方法,内部实现了坐标系统一(WGS84)、几何合并与GeoJSON格式转换,并最终封装为Earth Engine兼容的几何结构用于遥感分析或区域提取。; 适合人群:具备Python编程基础,熟悉地理信息系统(GIS)数据处理的科研人员或开发者,尤其是需要将本地或全球地理数据接入Google Earth Engine平台进行遥感分析的技术人员; 使用场景及目标:①将野外采样点、研究区边界等地理数据快速导入Earth Engine进行遥感影像分析;②利用GADM全球行政区划数据库动态获取国家或省级行政边界的几何对象,实现自动化区域统计;③为构建基于Web的地图分析工具提供后端几何解析支持; 阅读建议:使用前需安装geopandas、pygadm、earthengine-api等依赖库,注意处理异常情况如文件路径错误、坐标系不匹配或网络请求失败,建议结合实际数据调试各解析函数。

111,120

社区成员

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

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

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