如何创建多个线程并等待所有线程完成?

推荐答案

这取决于版本.您正在使用的NET框架.NET 4.0使用任务使线程管理变得更加简单:

class Program
{
    static void Main(string[] args)
    {
        Task task1 = Task.Factory.StartNew(() => doStuff());
        Task task2 = Task.Factory.StartNew(() => doStuff());
        Task task3 = Task.Factory.StartNew(() => doStuff());

        Task.WaitAll(task1, task2, task3);
                Console.WriteLine("All threads complete");
    }

    static void doStuff()
    {
        //do stuff here
    }
}

在.NET的早期版本中,您可以使用BackgroundWorker对象,使用ThreadPool.QueueUserWorkItem(),或者手动创建线程并使用Thread.Join()等待它们完成:

static void Main(string[] args)
{
    Thread t1 = new Thread(doStuff);
    t1.Start();

    Thread t2 = new Thread(doStuff);
    t2.Start();

    Thread t3 = new Thread(doStuff);
    t3.Start();

    t1.Join();
    t2.Join();
    t3.Join();

    Console.WriteLine("All threads complete");
}

.net相关问答推荐

无法对.NET MAUI类库进行单元测试

无法实例化类的代理:System.Net.HttpWebRequest.找不到无参数构造函数

value 的默认参数必须是编译时间常数?

将 BitmapImage 转换为 Bitmap,反之亦然

将 Topshelf 应用程序安装为 Windows 服务

如何使用 log4net 记录跟踪消息?

C# 中的 myCustomer.GetType() 和 typeof(Customer) 有什么区别?

基于多个字符分隔符拆分字符串

在 .NET 中查找下一个 TCP 端口

在 .NET 中填充整数列表

如何正确和完全关闭/重置 TcpClient 连接?

您可以使用 Xamarin 开发 Linux 应用程序吗?

静态方法继承的正确替代方法是什么?

为什么 double.NaN 不等于自身?

如何修复 .NET Windows 应用程序在启动时崩溃并出现异常代码:0xE0434352?

System.IO.IOException:使用 System.IO.Path.GetTempFileName() 时文件存在 - 解决方案?

C# ListView 列宽自动

LINQ 可以与 IEnumerable 一起使用吗?

C#/.NET 中仅命名空间的类可见性?

Linq Query 不断抛出无法创建 System.Object 类型的常量值......,为什么?