我在工作中遇到了一个相当尴尬的困境.我们需要在4个或5个不同的服务中创建用户,并以这样的方式进行设置:如果一个失败,它们都会失败.它们封装在事务范围块中.
我们需要添加用户的服务之一需要telnet,并捏造一些数据.还有其他方法可以做到这一点(这需要花钱)但是现在这就是我们所坚持的.添加一个用户大约需要3分钟.我们将努力将这一点大幅度降低,这可以想象,但这不是重点.这个调用是异步的,必须要正常工作.一句话是,该服务最多只能有10个连接.
我们的项目正在设置为批量创建用户.因此,一次可能创建50个用户.当只能通过telnet建立10个连接时,这会产生一个问题,并且处理过的用户除了telnet服务之外不可能花费很长时间.我现在需要同步这个过程,所以其余的都不能继续,直到它完成.
我们正在使用带有异步调用的回调和委托来实现该功能.什么是封装异步部分的最佳方法,并且在完成之前不会继续?
我们应该设置一个仅在呼叫结束时终止的循环吗?线程库中有什么东西可以帮助吗?我之前从未使用过线程,所以这对我来说是第一次.有什么工具可以帮助解决这个问题?
编辑:
如果我使用BeginInvoke/EndInvoke模式,那么第一个委托中的异步调用是否也会使开头/结尾?
例:
public void dele1(string message) { Console.Write(message); delegate2 del2 = new delegate2; del2(); Console.Write("End of Delegate 2"); } public void dele2() { // Long Processing Console.Write("Delegate 2"); } public delegate void delegate1(String message); public delegate void delegate2(); delegate1 del1 = new delegate1(dele1); del1("Delegate 1").BeginInvoke; del1().EndInvoke; Console.Write("End of Delegate 1");
//预期输出(结束调用等待代理2完成):
Delegate 1 End of Delegate 2 Delegate 2 End of Delegate 1
//或(结束调用仅等待委托1完成但不是任何内部委托调用):
Delegate 1 End of Delegate 2 End of Delegate 1 Delegate 2
结束调用会等到第二个代理完成处理吗?或者我是否需要在所有委托调用中使用调用模式?
您确实可以使用监视器,信号量,或者甚至可以旋转等待,直到您的异步方法调用完成.
但你也可以免费获得这个.如果调用EndInvoke()
以前启动过的委托BeginInvoke()
,则会阻塞,直到异步工作完成.
不确定这是否有帮助,因为您必须使用此异步模式.如果是这样,您将获得免费的异步执行(以及从异步转换回同步调用).
有关此模式的详细信息,请查看在MSDN上异步调用同步方法.
我希望这有帮助!