当前位置:  开发笔记 > 编程语言 > 正文

在c#中同步异步调用

如何解决《在c#中同步异步调用》经验,为你挑选了1个好方法。

我在工作中遇到了一个相当尴尬的困境.我们需要在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

结束调用会等到第二个代理完成处理吗?或者我是否需要在所有委托调用中使用调用模式?



1> Aaron..:

您确实可以使用监视器,信号量,或者甚至可以旋转等待,直到您的异步方法调用完成.

但你也可以免费获得这个.如果调用EndInvoke()以前启动过的委托BeginInvoke(),则会阻塞,直到异步工作完成.

不确定这是否有帮助,因为您必须使用此异步模式.如果是这样,您将获得免费的异步执行(以及从异步转换回同步调用).

有关此模式的详细信息,请查看在MSDN上异步调用同步方法.

我希望这有帮助!

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有