C#如何确保单线程的执行顺序 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
sunhk25

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

  •  
  •   sunhk25 May 1, 2017 2436 views
    This topic created in 3283 days ago, the information mentioned may be changed or developed.
    A.exe 中调用单线程 B.exe 来生成一个文件,文件名为秒时间例如 HHmms.txt
    当在 A 中快速点击调用 B 的时候,如何确保点击的顺序跟执行的顺序一致?
    A 程序无法修改,我有在 B 中添加 mutex 和 Thread.Sleep(1000)来确保执行一次要一秒,
    但是下一个执行的任务却是随机的,无法保证按点击顺序来执行
    Supplement 1    May 1, 2017

    原来的程序使用C++实现的,执行起来貌似也是按点击顺序来执行的,但是在C#用Mutex类无法达到效果

    CArkMutex::~CArkMutex() { if (bCreate) { ReleaseMutex(m_hMutex); CloseHandle(m_hMutex); } if (m_hProc != NULL) CloseHandle( m_hProc); } bool CArkMutex::Create(const char *pszName) { if (bCreate) return false; m_hMutex = CreateMutex(0, FALSE, pszName); if (m_hMutex) { bCreate = true; } return bCreate; } bool CArkMutex::Enter() { if (!bCreate) return false; WaitForSingleObject(m_hMutex, INFINITE); return true; } bool CArkMutex::Leave() { if (!bCreate) return false; ReleaseMutex(m_hMutex); return true; } 
    Supplement 2    May 1, 2017

    原来的程序使用C++实现的,执行起来貌似也是按点击顺序来执行的,但是在C#用Mutex类无法达到效果

    CArkMutex::~CArkMutex() { if (bCreate) { ReleaseMutex(m_hMutex); CloseHandle(m_hMutex); } if (m_hProc != NULL) CloseHandle( m_hProc); } bool CArkMutex::Create(const char *pszName) { if (bCreate) return false; m_hMutex = CreateMutex(0, FALSE, pszName); if (m_hMutex) { bCreate = true; } return bCreate; } bool CArkMutex::Enter() { if (!bCreate) return false; WaitForSingleObject(m_hMutex, INFINITE); return true; } bool CArkMutex::Leave() { if (!bCreate) return false; ReleaseMutex(m_hMutex); return true; } 
    Supplement 3    May 10, 2017
    ------------------------
    由于是进程间执行顺序的问题,采用了第三方工具把待处理的任务保存到队列后然后再顺序执行。
    具体做法是用 IPC 进程间通信,调用 B 时在 B 中把执行内容放到主程序的远程对象队列 Queue<string>中
    然后在主程序中再从队列里面拿出来了调用 B (在 B 中判断是主程序调用还是 A 中调用)
    11 replies    2017-05-10 13:15:45 +08:00
    momocraft
        1
    momocraft  
       May 1, 2017   1
    能不能说一下确保的目的是什么?
    sunhk25
        2
    sunhk25  
    OP
       May 1, 2017
    @momocraft 生成的文件是类似 HHmmss.txt 这样的以秒为单位的文件名,所以一秒内多次执行时需要控制进程等待
    ipconfiger
        3
    ipconfiger  
       May 1, 2017   1
    A 中每次点击都先用一个线程安全的 FIFO 对列存起来, 然后在一个独立的线程中一个一个取出来去调用 B
    zmj1316
        4
    zmj1316  
       May 1, 2017   1
    A 里面搞一个队列,点一次就向队列里丢一个,另外 A 开一个新线程,每次从队列里面取一个出来调用 B,并且阻塞等待 B 结束,这样可以保证只有一个 B 在执行,并且顺序和队列一致。

    如果只用单线程也可以实现,阻塞改成 poll 就行了
    sunhk25
        5
    sunhk25  
    OP
       May 1, 2017
    @ipconfiger @zmj1316 在 A 里实现的话确实可以,问题是 A 程序无法修改,如何在 B 中实现
    ipconfiger
        6
    ipconfiger  
       May 1, 2017
    B 里面也可以做到, 思路类似, 不过因为 B 是被调用方, 所以需要用额外的跨进程存储结构来维持对列
    Valyrian
        7
    Valyrian  
       May 1, 2017 via iPad   1
    Lockfile
    sunhk25
        8
    sunhk25  
    OP
       May 1, 2017
    @ipconfiger 试了几种队列调用方式(lock,ThreadPool),在 B 中测试时可以保证顺序,但是从 A 里调用 B 时,顺序还是随机。请问在 B 中如何管理额外的跨进程队列
    sunhk25
        9
    sunhk25  
    OP
       May 1, 2017
    @Valyrian Lockfile 能解决随机的问题吗
    Valyrian
        10
    Valyrian  
       May 2, 2017
    @sunhk25 可以吧,在文件内容里做一些手脚
    sunhk25
        11
    sunhk25  
    OP
       May 10, 2017
    About     Help     Advertise     Blog     API     FAQ     Solana     5692 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 61ms UTC 08:20 PVG 16:20 LAX 01:20 JFK 04:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86