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

2017-05-01 10:19:36 +08:00
 sunhk25
A.exe 中调用单线程 B.exe 来生成一个文件,文件名为秒时间例如 HHmms.txt
当在 A 中快速点击调用 B 的时候,如何确保点击的顺序跟执行的顺序一致?
A 程序无法修改,我有在 B 中添加 mutex 和 Thread.Sleep(1000)来确保执行一次要一秒,
但是下一个执行的任务却是随机的,无法保证按点击顺序来执行
2099 次点击
所在节点    问与答
11 条回复
momocraft
2017-05-01 10:25:27 +08:00
能不能说一下确保的目的是什么?
sunhk25
2017-05-01 10:39:16 +08:00
@momocraft 生成的文件是类似 HHmmss.txt 这样的以秒为单位的文件名,所以一秒内多次执行时需要控制进程等待
ipconfiger
2017-05-01 10:50:53 +08:00
A 中每次点击都先用一个线程安全的 FIFO 对列存起来, 然后在一个独立的线程中一个一个取出来去调用 B
zmj1316
2017-05-01 10:52:45 +08:00
A 里面搞一个队列,点一次就向队列里丢一个,另外 A 开一个新线程,每次从队列里面取一个出来调用 B,并且阻塞等待 B 结束,这样可以保证只有一个 B 在执行,并且顺序和队列一致。

如果只用单线程也可以实现,阻塞改成 poll 就行了
sunhk25
2017-05-01 11:13:10 +08:00
@ipconfiger @zmj1316 在 A 里实现的话确实可以,问题是 A 程序无法修改,如何在 B 中实现
ipconfiger
2017-05-01 11:40:17 +08:00
B 里面也可以做到, 思路类似, 不过因为 B 是被调用方, 所以需要用额外的跨进程存储结构来维持对列
Valyrian
2017-05-01 11:42:22 +08:00
Lockfile
sunhk25
2017-05-01 16:41:53 +08:00
@ipconfiger 试了几种队列调用方式(lock,ThreadPool),在 B 中测试时可以保证顺序,但是从 A 里调用 B 时,顺序还是随机。请问在 B 中如何管理额外的跨进程队列
sunhk25
2017-05-01 16:43:22 +08:00
@Valyrian Lockfile 能解决随机的问题吗
Valyrian
2017-05-02 01:48:46 +08:00
@sunhk25 可以吧,在文件内容里做一些手脚
sunhk25
2017-05-10 13:15:45 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/358325

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX