【发布时间】:2009-03-16 07:38:40
【问题描述】:
我在工作中的一个项目中遇到了相当尴尬的困境。我们需要在 4 或 5 个不同的服务中创建用户,并以这样一种方式进行设置,即如果一个失败,它们都会失败。它们被封装在一个事务范围块中。
我们需要添加用户的服务之一需要远程登录并伪造一些数据。还有其他方法可以做到(这需要花钱),但现在这就是我们所坚持的。添加一名用户大约需要 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");
// 预期输出(End Invoke 等到 Delegate 2 完成):
Delegate 1
End of Delegate 2
Delegate 2
End of Delegate 1
// 或者(End Invoke 只等待委托 1 完成,而不是任何内部委托调用):
Delegate 1
End of Delegate 2
End of Delegate 1
Delegate 2
是否会等到第二个委托也完成处理才结束调用?还是我需要在所有委托调用中使用调用模式?
【问题讨论】:
-
不确定您编辑的示例的语法。您能否进一步说明 del1 发生了什么?
标签: c# multithreading asynchronous delegates