与多个 Web 服务器 C# 的异步通信

Asynchronous communication with multiple web servers C#


我有一个 'main' 服务器,还有几个其他服务器(Extensions)需要由主服务器控制。

Extensions 每个都有一个对其各自服务器的 Web 引用。通过 Init()Start()Stop() 网络调用来控制这些扩展。到目前为止,我是同步执行此操作的,例如主服务器调用:

public void InitExtensions()
{
    foreach (Extension extension in GetEnabledExtensionList())
    {
        extension.Init();
    }
}

比:

public void StartExtensions()
{
    foreach (Extension extension in GetEnabledExtensionList())
    {
        extension.Start();
    }
}

其中 extension.Init()extension.Start() 将进行网络调用。

现在我想异步执行此操作,但棘手的部分是 StartExtensions() 方法应等待 extension.Init() 完成。当然可以在初始化另一个 Extension 之前启动它。

最好的方法是什么?我想我需要例如列表

List<Thread> _InitThreads;
List<Thread> _StartThreads;
List<Thread> _StopThreads;

并检查每个列表是否包含相应扩展的线程,并 Join() 它等待执行。然而,这变得非常困难非常快...

假设您的 Init() 方法是同步的(即您不需要等待事件通知它已完成),这应该可以做到这一点

public void InitAndStartExtensions()
{
    foreach (Extension extension in GetEnabledExtensionList())
    {
        Task.Run(() =>
        {
            extension.Init();
            extension.Start();
        });
    }
}

您可以使用并行 foreach。这会并行(异步)执行迭代并等待所有迭代完成(意味着 foreach 之后的下一次调用将在所有迭代完成后执行)

Parallel.ForEach(GetEnabledExtensionList(), (extension) => 
{
     extension.Init();
     extension.Start();
});

这是一个好方法,因为您会知道,当您的所有服务器都已启动时,并行 Tasks/Threads 将由 [=16= 有效地处理(数量、优先级等) ].