【发布时间】:2014-12-03 17:34:01
【问题描述】:
我正在尝试第四次写这个问题,因为很遗憾我不确定我真正想要什么。请原谅我含糊不清或有点离题。
我有一个命令行 .NET4.5 C# 应用程序。我将在两个地理位置相距遥远的地方同时运行它。我希望能够将一个实例变成主机,另一个变成客户端。
在它的核心,我想要一个 TextReader 实现,它在 Read/ReadLine 上等待来自远程客户端的输入。我还想要一个 TextWriter,它会在 Write/WriteLine 上调用远程客户端并将文本传递给它。
TextWriter 当然是相当简单的事情,因为我基本上是这样做的:在写入时,将client.SendText(s); 调用到另一个实例。
在那种情况下,我该如何实现TextReader.ReadLine()?一种天真的方法是在 WCF 服务中拥有一个方法:
class Service : IService{
void SendText(string s){
Console.WriteLine(s); // or whatever is the destination TextWriter
}
string ReadLine(){
return Console.ReadLine(); // or whatever is the source TextReader
}
}
但是让 WCF 操作调用打开几分钟甚至几小时是个好主意吗?
我可以看到的另一种方式是:
class Service : IService{
void RegisterClient(string url){/* url points to an IService endpoint in client*/}
void SendString(string s){...}
}
然后在两个实例中托管它,从提供自己的端点 url 的客户端调用 RegisterClient,然后如果主机想要向客户端返回一些数据 - 只需调用 SendString,没问题。但是如果主机必须等待客户端的输入,如何合理解决呢?
class WCFTextReader : TextReader{
public override string ReadLine(){
// what here? it should return whatever comes in the next SendString call from client...
}
}
我可以有一个Queue<string> 的传入消息,然后执行一个while(true),然后先从Queue 或Thread.Sleep 返回一段时间并重新检查,但每次我觉得我需要@ 987654331@ 和 Thread.Sleep 我宁愿来这里,因为我觉得我错过了什么......
【问题讨论】:
-
我建议您忘记
TextReader和TextWriter,而直接使用 WCF。 -
听起来你想使用WCF的duplex channel shape,这样你就可以进行异步双向通信了。
标签: c# wcf console-application