gpt4 book ai didi

c# - 等待所有异步网络服务调用返回

转载 作者:行者123 更新时间:2023-11-30 22:34:05 25 4
gpt4 key购买 nike

我有一个桌面应用程序 (.net 3.5),它使用经典网络服务与服务器通信。
我需要多次调用 Web 服务函数,等待它们全部完成,然后再继续。

我想并行进行这些调用;所以很明显,我希望利用 MyFunctionAsync 方法。
问题是——我不确定如何验证所有调用都已返回。我可能在这里遗漏了一些简单的同步机制。

这是我希望能够做的:

public void DoWork()
{
service.MyFuncCompleted+= MyFunc_Completed;
foreach (var i in items)
{
service.MyFuncAsync(i);
syncMechanism.WaitForAnother(1); //signal that we have to wait for 1 more task to finish
}
syncMechanism.WaitForAllTasksToFinsih(); //wait until specified number of tasks have finished

//continue
}

public void MyFunc_Completed(EventArgs e)
{
//process result...
syncMechanism.Signal(1); //signal that 1 task has finished
}

有人知道这样的东西是 C# 吗?

最佳答案

这 (fork/join) 在 .NET 4 中要容易得多,但你使用的是 3.5,所以你必须以老式的方式进行。

基本上,为每个操作递增一个计数器,然后在您的 Completed 处理程序中递减它。然后检查它是否已降至零,如果是,则发出等待句柄信号以指示所有操作已完成。

下面是这个想法的一个例子:

static ManualResetEvent mre = new ManualResetEvent( false );
static int inFlight = 1; // start with 1 to fix race condition

static void DoWork()
{
for ( int i = 0 ; i < 10 ; i++ )
{
var bw = new BackgroundWorker();

bw.DoWork += bw_DoWork;
bw.RunWorkerCompleted += bw_RunWorkerCompleted;

Interlocked.Increment( ref inFlight );

bw.RunWorkerAsync();
}

if ( Interlocked.Decrement( ref inFlight ) == 0 ) mre.Set();

mre.WaitOne(); // this blocks until all workers have completed
}

static void bw_DoWork( object sender, DoWorkEventArgs e )
{
Thread.Sleep( 1000 );
}

static void bw_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e )
{
if ( Interlocked.Decrement( ref inFlight ) == 0 ) mre.Set();
}

关于c# - 等待所有异步网络服务调用返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7995999/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com