与多个 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= 有效地处理(数量、优先级等) ].
我有一个 '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= 有效地处理(数量、优先级等) ].