楼主:
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;
}