[问题] NDDE server/client写在同一支程式

楼主: zaqimon (dream)   2020-04-07 20:29:44
我是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;
}
作者: Litfal (Litfal)   2020-04-07 22:31:00
你是要做到reentrace还是thread safe? 这里应该很少在讨论reentrant的,你也应该不是遇到这个问题吧
作者: ssccg (23)   2020-04-08 09:29:00
不懂为什么这种程式会想要做到一进一出? 除非预期只有一个client,不然这样效能不会很差吗?通常只会想做thread safe,结果对就好执行顺序不重要吧至于会有exception那应该是要去研究到底为什么有exception
作者: Litfal (Litfal)   2020-04-08 19:39:00
高阶语言不在意reentrance,你讲这个字还没什么人懂。很多人连interrupt都不知道也能写一手好程式。你的问题应该是thread safe你用lock挡不住也不正常,先确定写法吧

Links booklink

Contact Us: admin [ a t ] ucptt.com