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

黑娃 2017-06-02 10:26:42
问题:线程A是一个正在运行的后台线程(自己创建的,非UI线程),可以认为它在一个死循环里面周而复始的运行着,在某一时刻,我希望这个线程能够“抽空”执行一段“额外的代码”,它不是线程A执行函数中的代码,而是额外添加的一段,并且执行完这段代码之后,线程A能继续执行它原来的函数代码。这种需求就类似于在wpf的后台线程中要去更新UI线程的控件,但只能通过控件的dispatcher去执行更新操作。我就是希望能够对普通线程也这样做,不知道怎么破?
...全文
921 27 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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)
《概率论与数理统计》是理工科大学中的一门重要基础课程,它结合了概率论的基本理论与统计学的方法,用于分析和处理随机现象。第二版的完整版多媒体教学系统旨在通过丰富的教学资源和互动体验,帮助学生深入理解和掌握这门学科的核心概念。 一、概率论基础 概率论是研究随机事件及其规律性的数学理论,主要包括以下几个关键概念: 1. 随机试验:概率论的研究对象,如掷骰子、抽卡等。 2. 样本空间:所有可能结果的集合。 3. 事件:样本空间的子集,代表某种特定的结果。 4. 概率:事件发生的可能性,通常介于0和1之间,表示为P(A)。 5. 条件概率:在已知某个事件发生的情况下,另一个事件发生的概率。 6. 乘法法则和加法法则:用于计算两个独立或不独立事件的概率。 二、概率分布 1. 离散概率分布:如二项分布、泊松分布、几何分布、超几何分布等,用于描述离散随机变量的分布情况。 2. 连续概率分布:如均匀分布、正态分布、指数分布等,适用于连续随机变量。 三、统计学基础 1. 参数估计:通过样本数据估计总体参数,如均值、方差等。 2. 抽样分布:统计量在多次重复抽样下的分布情况。 3. 点估计和区间估计:给出参数的一个估计值或一个估计范围。 4. 假设检验:检验关于总体参数的假设是否成立,如t检验、卡方检验、F检验等。 5. 回归分析:研究两个或多个变量间的关系,预测一个变量基于其他变量的值。 四、数理统计方法 1. 最大似然估计:寻找使样本数据出现概率最大的参数估计方法。 2. 矩估计:通过总体矩与样本矩的关系来估计参数。 3. 正态分布的中心极限定理:大量独立随机变量的和近似服从正态分布,即使这些变量本身非正态。 4. 协方差和相关系数:衡量两个随机变量之间线性关系的强度和方向。 5. 方差分析(ANOVA):比较多个组别间的均值差异。 五、多元统计分析 1. 多元正态分布:多维空间中的正态分布,常用于多元线性回归。 2. 判别分析:根据已知分类的样本数据,建立判别函数,对数据进行分类。 3. 聚类分析:将相似数据分组,揭示数据内在结构。 4. 主成分分析(PCA):降低数据维度,提取主要特征。 六、多媒体教学系统 该教学系统可能包含以下组成部分: 1. 视频讲座:专家讲解理论和例题,直观展示概念。 2. 动画演示:动态模拟随机过程,帮助理解概率模型。 3. 交互式练习:提供习题和答案,实时反馈学习效果。 4. 实验教程:设计数学实验,让学生亲手操作,加深理解。 5. 电子教材:包含文字、图表、案例等丰富内容,便于自主学习。 通过这个多媒体教学系统,学生不仅可以学习到概率论与数理统计的理论知识,还能通过实践应用和互动学习,提升解决实际问题的能力。

111,110

社区成员

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

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

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