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

黑娃 2017-06-02 10:26:42
问题:线程A是一个正在运行的后台线程(自己创建的,非UI线程),可以认为它在一个死循环里面周而复始的运行着,在某一时刻,我希望这个线程能够“抽空”执行一段“额外的代码”,它不是线程A执行函数中的代码,而是额外添加的一段,并且执行完这段代码之后,线程A能继续执行它原来的函数代码。这种需求就类似于在wpf的后台线程中要去更新UI线程的控件,但只能通过控件的dispatcher去执行更新操作。我就是希望能够对普通线程也这样做,不知道怎么破?
...全文
908 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)

110,538

社区成员

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

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

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