C_Sharp 板


LINE

我是C#初学还没什麽完整的概念 以前有写过C所以对程式还算有概念 我想用NDDE写一支类似DDE proxy的中介程式 所以我的程式同时需要当DdeServer跟DdeClient 把DdeServer.OnRequest直接丢给DdeClient.Request 但事情没那麽简单 DdeServer.OnRequest只要超过一个item就很容易exception 因为OnRequest会有reentrance的问题 我的DdeServer跟DdeClient已经使用不同DdeContext去new 这样DdeServer跟DdeClient才能跑在不同ManagedThreadId以避免冲突 但依然还是无法解决DdeServer.OnRequest reentrance的问题 只要去call了ddeClient.Request就会发生reentrance 换成Sleep就不会发生reentrance 以下是我的DdeServer.OnRequest程式码 请问有办法解决这个reentrace的问题吗? 有测试过lock锁不住 测试过semaphore直接deadlock 谢谢 protected override RequestResult OnRequest(DdeConversation conversation, string item, int format) { if (format == 1) { byte[] re; Console.WriteLine(">>>"); //Thread.Sleep(1000); // no reentrance //re = ddeClient.Request(item, 1, 1000); // reentrance re = (byte[])ddeClient.Context.Invoke(new Func<byte[]>(() => ddeClient.Request(item, 1, 1000)), null); // still reentrance Console.WriteLine("<<<"); return new RequestResult(re); } return RequestResult.NotProcessed; } --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 219.91.9.86 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1586262586.A.58D.html ※ 编辑: zaqimon (219.91.9.86 台湾), 04/07/2020 20:44:38
1F:推 Litfal: 你是要做到reentrace还是thread safe? 这里应该很少在讨论 04/07 22:31
2F:→ Litfal: reentrant的,你也应该不是遇到这个问题吧 04/07 22:31
当只有call Sleep()时Console log就很标准一进一出没有reentrance >>> <<< >>> <<< >>> <<< ... 但是当call了ddeClient.Request之後console log就变成 >>> <<< >>> >>> >>> <<< <<< <<< ... 然後程式就很容易exception 就当在ddeClient.Request那一行 我想只要能解决reentrance的问题应该就不会当掉 ※ 编辑: zaqimon (219.91.9.86 台湾), 04/08/2020 00:06:04
3F:→ ssccg: 不懂为什麽这种程式会想要做到一进一出? 除非预期只有一个 04/08 09:29
4F:→ ssccg: client,不然这样效能不会很差吗? 04/08 09:29
5F:→ ssccg: 通常只会想做thread safe,结果对就好执行顺序不重要吧 04/08 09:35
6F:→ ssccg: 至於会有exception那应该是要去研究到底为什麽有exception 04/08 09:35
7F:推 Litfal: 高阶语言不在意reentrance,你讲这个字还没什麽人懂。很多 04/08 19:39
8F:→ Litfal: 人连interrupt都不知道也能写一手好程式。你的问题应该是t 04/08 19:39
9F:→ Litfal: hread safe 04/08 19:39
10F:推 Litfal: 你用lock挡不住也不正常,先确定写法吧 04/08 19:43
因为每次OnRequest都是从DDEML callback过来的 都属於同一个thread lock好像只能挡住不同thread的样子吧 所以档不住是正常的 https://github.com/anphonic/NDde/ 应该说我不知道如何正确使用NDDE才能把DDE client/server写在同一支程式里面 大部分的使用情况不会需要把DDE client/server写在同一支程式 而且我的client/server之间还要呼叫到彼此的method 可能因此导致NDDE元件内部状态混乱吧 虽然NDDE有source code但我也看不懂 根据我简单测试 正常状态下DDE server的OnRequest不应该发生reentrance 但只要OnReuest内去呼叫到DdeClient.Request就会导致reentrance 然後就很容易exception 接下来我可能改用C# winform写写看 我好像有看到NDDE source code有建立隐藏视窗来处理window message 也许是console程式对thread或window message过敏吧 但NDDE给的sample程式又只是console而已 ※ 编辑: zaqimon (219.91.9.86 台湾), 04/08/2020 23:30:31
11F:推 Litfal: console那行把thread id也印出来看看是不是真的在同一个执 04/09 14:25
12F:→ Litfal: 行绪下吧,是的话应该是client.Request又呼叫进入了server 04/09 14:25
13F:→ Litfal: .OnRequest,你要想想这是不是合理的行为 04/09 14:25
14F:→ Litfal: 我的话会用BlockQueue把server和client隔离 04/09 14:26
有测试过不论DdeServer跟DdeClient的ManagedThreadId是否相同 都会发生这个reentrance的问题 可能当初NDDE作者没有想到有人会需要把DdeServer跟DdeClient放在一起吧 ※ 编辑: zaqimon (219.91.9.86 台湾), 04/10/2020 00:52:34







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Gossiping站内搜寻

TOP