我有两个应用程序,我想通过.NET 3.5上的命名管道进行通信.它是一个请求/响应范例,数据以XML格式传输,使我的生活更轻松.有一个监听器应用程序,以及一个将请求发布到管道的应用程序.我正在尝试使用双向管道来做到这一点.我遇到的问题是对StreamReader.ReadToEnd()的调用似乎没有返回.我该怎么做才能解决这个问题?
听众代码
public Class Listener
{
private void ThreadFunc()
{
var pipe = new NamedPipeServerStream("GuideSrv.Pipe",PipeDirection.InOut);
var instream = new StreamReader(pipe);
var outstream = new StreamWriter(pipe);
while (true)
{
pipe.WaitForConnection();
var response = ProcessPipeRequest(instream);
outstream.Write(response.ToString());
pipe.Disconnect();
}
}
private XDocument ProcessPipeRequest(StreamReader stream)
{
var msg_in = stream.ReadToEnd(); // << This call doesnt return
var xml_in = XDocument.Parse(msg_in);
// do some stuff here
return new XDocument(....);
}
}
Run Code Online (Sandbox Code Playgroud)
请求者代码
public XDocument doIt()
{
var xml = new XDocument(....);
using (var pipe …Run Code Online (Sandbox Code Playgroud) 我想知道双向Dijkstra算法的时间复杂度.
使用Min-Heap的普通Dijkstra有O(n log n + m).我的猜测是双向保持不变.然而,维基百科建议双向搜索的改进通常可以用O符号表示.
这是否可以计算双向Dijkstra以及如何计算?
一些描述 http/2 的文章称赞它是双向和全双工的。
AFAIK 双向意味着通信是双向的,所以双工本质上是双向的,是吗?
双工可以由一个在某些特定点反转的单工流创建(半双工),也可以创建为两个相反的单工流(全双工)。
也许双向是关于如何发起消息交换?在 http/1 中,只有客户端可以通过向服务器发送请求来启动,服务器在其中返回响应。在 http/2 中,服务器可以发送(推送)一些资源而无需明确要求它。但是我们可以Server-sent events在http/1.1中使用(也就是说,在客户端和服务器上都做了一些配置后,如果它愿意,服务器可以推送消息,但它仍然是通过http/1.1协议)。
当您考虑它时,您可能会注意到 http/1 也是双向和全双工的(因为在半双工中流水线是不可能的)。所以从 http/2 的角度来看这里没有变化。
发生变化的是 http/1 要求响应按照请求的确切顺序到达。http/2 通过流和多路复用提升了这一点。
在 Martin Fowler 的 UML Distilled 的“双向关联”部分,他说:
在编程语言中实现双向关联通常有点棘手,因为您必须确保两个属性保持同步。使用 C#,我使用以下代码来实现双向关联:
书中的代码
class Car...
public Person Owner {
get {return _owner;}
set {
if (_owner != null) _owner.friendCars().Remove(this);
_owner = value;
if (_owner != null) _owner.friendCars().Add(this);
}
}
private Person _owner;
...
class Person ...
public IList Cars {
get {return ArrayList.ReadOnly(_cars);}
}
public void AddCar(Car arg) {
arg.Owner = this;
}
private IList _cars = new ArrayList();
internal IList friendCars() {
//should only be used by Car.Owner
return _cars;
}
.... …Run Code Online (Sandbox Code Playgroud) 我一直在寻找一种处理双向关联的通用方法,以及一种处理手动编写的Java代码中的逆更新的方法.
对于那些不知道我在说什么的人,这里有一个例子.下面是我目前的(不满意)解决方案的结果.
public class A {
public B getB();
public void setB(B b);
}
public class B {
public List<A> getAs();
}
Run Code Online (Sandbox Code Playgroud)
现在,在更新关联的任何一端时,为了保持一致性,另一端也必须更新.每次手动
a.setB(b);
b.getA().add(a);
Run Code Online (Sandbox Code Playgroud)
或者通过在setter/getter中放置匹配代码并使用自定义List实现.
我发现了一个过时的,未维护的项目,其依赖关系不再可用(https://e-nspire-gemini.dev.java.net/).它通过使用用于自动注入必要代码的注释来处理问题.
有没有人知道另一个框架,以一种通用的,不引人注目的方式处理这个ala gemini?
ciao,Elmar
为了说明这个问题,我们使用一个简单的例子:有两个聚合 -Lamp和Socket。必须始终强制执行以下业务规则: aLamp和 aSocket都不能同时连接多次。为了提供适当的命令,我们设想了一个Connector带有Connect(Lamp, Socket)-method 的服务来插入它们。
因为我们希望遵守一个事务只涉及一个聚合的规则,所以不建议在事务中对两个聚合设置关联Connect。所以我们需要一个象征Connection自身的中间蕴。因此Connect-transaction 只会Connection使用给定的组件创建一个新的。不幸的是,此时麻烦开始了;如何保证连接状态的一致性?可能会发生许多并发用户想要在同一时间插入相同的组件,因此我们的“一致性检查”不会拒绝该请求。新的Connection聚合将被存储,因为我们只锁定聚合级别。即使不知道这一点,系统也会不一致。
但是我们应该如何设定聚合的边界来确保我们的业务规则呢?我们可以设想一个Connections聚合,它收集所有活动连接(作为Connection实体),从而使我们的锁定算法能够正确拒绝重复的Connect请求。另一方面,这种方法效率低下且无法扩展,而且在领域语言方面也是违反直觉的。
你知道我错过了什么吗?
编辑:为了总结这个问题,想象一个聚合User。由于聚合的定义是基于事务的单元,我们可以通过锁定每个事务的该单元来强制不变量。一切皆好。但现在出现了一条业务规则:用户名必须是唯一的。因此,我们必须以某种方式使我们的总体边界与这一新要求相协调。假设有数百万用户同时注册,这就成了一个问题。我们尝试确保非锁定状态下的这种不变性,因为多个用户意味着多个聚合。
根据 Eric Evans 所著的《领域驱动设计》一书,一旦单个事务中涉及多个聚合,就应该应用最终一致性。但这真的是这样吗?这有道理吗?
在这里应用最终一致性需要注册User并随后使用用户名检查不变量。如果两个Users 实际上设置了相同的用户名,系统将撤消第二次注册并通知User. 想到这种情况让我感到不安,因为它扰乱了整个注册过程。例如,发送确认电子邮件必须延迟等等。
我想我只是忘记了一些一般的事情,但我不知道是什么。在我看来,我需要类似Repository级别上的不变量之类的东西。
我目前正在我们的业务层中集成StructureMap,但由于双向依赖性而存在问题.
该层包含多个管理器,每个管理器可以相互调用方法:没有通信限制或规则.这还包括可能的循环依赖性,如下例所示.我知道设计本身是有问题的,但目前我们只是希望StructureMap能够工作,并将在未来专注于进一步的重构.
每个经理实现IManager接口:
internal interface IManager
{
bool IsStarted { get; }
void Start();
void Stop();
}
Run Code Online (Sandbox Code Playgroud)
并且还有自己的特定界面:
internal interface IManagerA : IManager
{
void ALogic();
}
internal interface IManagerB : IManager
{
void BLogic();
}
Run Code Online (Sandbox Code Playgroud)
这是两个虚拟管理器实现:
internal class ManagerA : IManagerA
{
public IManagerB ManagerB { get; set; }
public void ALogic() { }
public bool IsStarted { get; private set; }
public void Start() { }
public void Stop() { }
} …Run Code Online (Sandbox Code Playgroud) 考虑这个例子:
<input type="text" v-model="value">
<span>Value is: {{ value }}</span>
Run Code Online (Sandbox Code Playgroud)
我想要的是放置一个双向转换函数,它将以一种形式在输入字段中显示值,但将其保存在另一种形式的数据中.最简单的例子是否定数值:如果用户输入5,我想要实际接收的数据?5.在Vue.js 1.0中实现这一目标的最佳方法是什么?
.net ×1
.net-3.5 ×1
aggregate ×1
algorithm ×1
associations ×1
boundary ×1
data-binding ×1
dijkstra ×1
duplex ×1
http2 ×1
inverse ×1
java ×1
javascript ×1
named-pipes ×1
oop ×1
python ×1
structuremap ×1
uml ×1
vue.js ×1