C#如何确保待执行单线程任务的执行顺序

Sunhk_25 2017-05-02 11:40:47
A.exe 中调用单线程 B.exe 来生成一个文件,文件名为秒时间例如 HHmmss.txt
当在 A 中快速点击调用 B 的时候,如何确保点击的顺序跟执行的顺序一致?
在A 程序无法修改的情况下,我有在 B 中添加 mutex 和 Thread.Sleep(1000)来确保执行一次要一秒,
但是下一个执行的任务却是随机的,无法保证按点击顺序来执行
我试过lock,ManualResetEventLink ,ThreadPool,ReaderWriterLock都不能够保证顺序。

...全文
936 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sunhk_25 2017-05-09
  • 打赏
  • 举报
回复
引用 30 楼 From_TaiWan 的回复:
在B里面Sleep();,似乎没什么用,浪费时间 让B执行完操作后,返回个东西 但是,A不能修改,好像不好弄
是的,所以麻烦点,现在已解决,用的这个方法 具体做法是用IPC进程间通信,调用B时在B中把执行内容放到主程序的远程对象队列Queue<string>中 然后在主程序中再从队列里面拿出来了调用B(在B中判断是主程序调用还是A中调用)
Sunhk_25 2017-05-09
  • 打赏
  • 举报
回复
引用 29 楼 u012394290 的回复:
例如下单秒杀一样的。一个队列保存Queue<orderInfo>,你可以把orderinfo理解成你点击需要处理的数据,然后服务器有一个线程一直在跑,做的事情就是从Queue<orderInfo>取出数据处理,先进先出原则就有顺序了,那这个队列在B1和B2之间是如何控制的呢这个问题你去百度下队列吧,先进先出就是处理你说的执行顺序
谢谢,用这个方法解决了B执行顺序的问题 具体做法是用IPC进程间通信,调用B时在B中把执行内容放到主程序的远程对象队列Queue<string>中 然后在主程序中再从队列里面拿出来了调用B(在B中判断是主程序调用还是A中调用)
秋的红果实 2017-05-09
  • 打赏
  • 举报
回复
在B里面Sleep();,似乎没什么用,浪费时间 让B执行完操作后,返回个东西 但是,A不能修改,好像不好弄
程序员-阿勇 2017-05-09
  • 打赏
  • 举报
回复
引用 28 楼 Sunhk_25 的回复:
[quote=引用 26 楼 u012394290 的回复:] [quote=引用 4 楼 hanjun0612 的回复:] 看起来,你是要确保B1(第一次点击)和B2(第二次点击)的执行顺序吧? 感觉你使用单列模式比较合适。只有当B1完成后,B2才能执行。
我曾经写过类似的代码,在B中邪一个静态队列,A调用B就只管往队列里面丢数据,然后用一个变量判断现在B是是否有县城在处理队列,有线程处理就什么也不做,没有线程处理就修改变量的值表示在处理,并且一个个取出队列中的数据进行处理操作,处理完队列所有数据,修改变量标注没有线程在处理队列,就行了[/quote] 请问静态队列是指Queue<Action>,那这个队列在B1和B2之间是如何控制的呢[/quote] 例如下单秒杀一样的。一个队列保存Queue<orderInfo>,你可以把orderinfo理解成你点击需要处理的数据,然后服务器有一个线程一直在跑,做的事情就是从Queue<orderInfo>取出数据处理,先进先出原则就有顺序了,那这个队列在B1和B2之间是如何控制的呢这个问题你去百度下队列吧,先进先出就是处理你说的执行顺序
Sunhk_25 2017-05-09
  • 打赏
  • 举报
回复
引用 26 楼 u012394290 的回复:
[quote=引用 4 楼 hanjun0612 的回复:] 看起来,你是要确保B1(第一次点击)和B2(第二次点击)的执行顺序吧? 感觉你使用单列模式比较合适。只有当B1完成后,B2才能执行。
我曾经写过类似的代码,在B中邪一个静态队列,A调用B就只管往队列里面丢数据,然后用一个变量判断现在B是是否有县城在处理队列,有线程处理就什么也不做,没有线程处理就修改变量的值表示在处理,并且一个个取出队列中的数据进行处理操作,处理完队列所有数据,修改变量标注没有线程在处理队列,就行了[/quote] 请问静态队列是指Queue<Action>,那这个队列在B1和B2之间是如何控制的呢
小灰狼 2017-05-08
  • 打赏
  • 举报
回复
引用 22 楼 Sunhk_25 的回复:
[quote=引用 20 楼 hemowolf 的回复:] A.exe、B.exe 这是进程,不是线程了吧
你说的对,是进程间执行顺序的控制[/quote] 如果A.exe 和 B.exe 的程序都是由你来编译并部署的话,可以借助数据库对表和行的锁功能来实现,也可以用redis。思路就是借助第三方的一个系统对连接的客户端(A.exe、B.exe)达到进程间通信的目的。
Sunhk_25 2017-05-08
  • 打赏
  • 举报
回复
引用 21 楼 jaylongli 的回复:
两个进程之间是相互独立的,不可能排队, 除非通过锁或者中间标志位,共同读取来控制两个进程的交互
我试了用共享文件来保存执行顺序的方法,但是不是很理想,写文件的先后有问题
Sunhk_25 2017-05-08
  • 打赏
  • 举报
回复
引用 20 楼 hemowolf 的回复:
A.exe、B.exe 这是进程,不是线程了吧
你说的对,是进程间执行顺序的控制
小灰狼 2017-05-08
  • 打赏
  • 举报
回复
引用 25 楼 Sunhk_25 的回复:
[quote=引用 24 楼 hemowolf 的回复:] 如果A.exe 和 B.exe 的程序都是由你来编译并部署的话,可以借助数据库对表和行的锁功能来实现,也可以用redis。思路就是借助第三方的一个系统对连接的客户端(A.exe、B.exe)达到进程间通信的目的。
我能修改的就是B.EXE,我又试了一下进程间通信ipc,做法跟利用一个共用文件一个道理,效果也不行 看来进程B被启动后,再在B中控制是比较困难的[/quote] 如果你不能控制两个进程,处理起来确实很麻烦 进程通信远不如线程通信那么方便
程序员-阿勇 2017-05-08
  • 打赏
  • 举报
回复
引用 4 楼 hanjun0612 的回复:
看起来,你是要确保B1(第一次点击)和B2(第二次点击)的执行顺序吧? 感觉你使用单列模式比较合适。只有当B1完成后,B2才能执行。
我曾经写过类似的代码,在B中邪一个静态队列,A调用B就只管往队列里面丢数据,然后用一个变量判断现在B是是否有县城在处理队列,有线程处理就什么也不做,没有线程处理就修改变量的值表示在处理,并且一个个取出队列中的数据进行处理操作,处理完队列所有数据,修改变量标注没有线程在处理队列,就行了
Sunhk_25 2017-05-08
  • 打赏
  • 举报
回复
引用 24 楼 hemowolf 的回复:
如果A.exe 和 B.exe 的程序都是由你来编译并部署的话,可以借助数据库对表和行的锁功能来实现,也可以用redis。思路就是借助第三方的一个系统对连接的客户端(A.exe、B.exe)达到进程间通信的目的。
我能修改的就是B.EXE,我又试了一下进程间通信ipc,做法跟利用一个共用文件一个道理,效果也不行 看来进程B被启动后,再在B中控制是比较困难的
小灰狼 2017-05-04
  • 打赏
  • 举报
回复
A.exe、B.exe 这是进程,不是线程了吧
加油馒头 2017-05-04
  • 打赏
  • 举报
回复
两个进程之间是相互独立的,不可能排队, 除非通过锁或者中间标志位,共同读取来控制两个进程的交互
正怒月神 2017-05-02
  • 打赏
  • 举报
回复
看起来,你是要确保B1(第一次点击)和B2(第二次点击)的执行顺序吧? 感觉你使用单列模式比较合适。只有当B1完成后,B2才能执行。
  • 打赏
  • 举报
回复
你这样设计程序决定了你的每个B都是一个单独的个体,相互间没有关联,没办法很好的做到顺序执行。只有通过其他非常规的取巧的方法。比如,你创建一个公共文件,所有的B程序在开始的时候都为自己创建一个ID,并将ID写入到公共文件的结尾。如果ID在文件中已存在,则更换ID。每个B程序都相隔固定的时间读取公共文件,看第一个ID是不是自己的,如果是则表示该自己执行了。当B程序执行完后,自己从公共文件中删除自己的ID。这样就可以通过公共文件来控制顺序执行。
xuggzu 2017-05-02
  • 打赏
  • 举报
回复
你的A和B本来就是单线程,不存在不顺序执行的问题。
查查B执行有无其它问题。
Sunhk_25 2017-05-02
  • 打赏
  • 举报
回复
是不是在A中启动B的时候就已经没有办法了啊,难道如果有多个待执行的任务的话,下一个执行哪个都是随机吗?
  • 打赏
  • 举报
回复
lz 硬是“不改 A”,所以没法 WaitForExit。
wanghui0380 2017-05-02
  • 打赏
  • 举报
回复
p.WaitForExit();//等待执行的完成 if(p.ExitCode == 0)//正常执行; if(p.ExitCode == -1)//不正常执行。
wanghui0380 2017-05-02
  • 打赏
  • 举报
回复
Process?难怪了。
加载更多回复(12)

110,533

社区成员

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

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

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