Process != Thread
线程存在于进程中,而进程是操作系统中的整个程序或服务。
如果你想加快你的应用程序初始化,你仍然可以使用线程,但现在我们使用 Task Parallel Library 使用它们,使用 Task Asynchronous Pattern。
为了通信任务(通常是线程),您可能需要实现某种状态机(某种基本工作流程),您可以在其中检测某些任务何时进行并根据任务状态(正在运行、失败、已完成...)。
无论如何,您不需要命名管道或类似的东西来通信任务/线程,因为一切都在同一个父进程中。也就是说,您需要使用常规编程方法来执行此操作。我的意思是:使用 C# 和线程同步机制以及某种应用内消息传递。
一些非常基本的想法...
.NET 有一个 List<T> 集合类。您应该设计一个协调器类,您可以在其中添加一些接收消息类(由您设计)的列表,如下所示:
public enum OperationType { DataInitialization, Authentication, Caching }
public class Message
{
public OperationType Operation { get; set; }
public Task Task { get; set; }
}
然后开始所有并行初始化任务,将每个人添加到协调器类中的列表中:
Coordinator.Messages.AddRange
(
new List<Message>
{
new Message
{
Operation = Operation.DataInitialization,
Task = dataInitTask
},
..., // <--- more messages
}
);
添加所有带有待处理初始化任务的消息后,您可以在代码中的某处等待初始化以这种方式异步结束:
// You do a projection of each message to get an IEnumerable<Task>
// to give it as argument of Task.WhenAll
await Task.WhenAll(Coordinator.Messages.Select(message => message.Task));
当这一行等待完成所有初始化时,您的 UI(即主线程)可以继续工作并显示某种加载动画或谁知道是什么(无论如何)。
也许您可以更进一步,不要等待所有任务,而是等待一组任务允许您的用户开始使用您的应用,而其他非关键任务结束......