Làm thế nào để main thread đợi các thread con C#

Chào mọi người!
Em đang tìm hiểu về thread, và em có một thắc mắc:

    static void Main(string[] args)
    {
        for (int i = 0; i < numThreads; i++)
        {
            Thread mycorner = new Thread(new ThreadStart(DoSomeThing));
            mycorner.Name = String.Format("Thread{0}", i + 1);
            mycorner.Start();
        }    
        Console.WriteLine("sdfsdfsf");
        Console.Read();
    }

em có viết một đoạn code như trên, khi chay thì main thread cũng chạy chung và dòng Console.WriteLine("sdfsdfsf"); in ra màn hình xen lẫn với các lệnh của những thread khác.
Vấn đề là em muốn mainthread sẽ thực hiện câu lệnh này sau cùng khi các thread khác đã hoàn thành. Không sử dụng thread.sleep(); ạ.
Giúp em với ạ, em cảm ơn!

Có thể bạn muốn dùng Thread.Join()

5 Likes

cảm ơn bác, nhưng nếu dùng thread.join() thì các child thread sẽ cũng chờ nhau theo thứ tự, em muốn chỉ mình main thread chờ thôi

À, mình xin lỗi.

Có 2 cách:

  1. Thủ công: dùng vòng lặp để chờ các luồng chạy xong. Xem thử: https://repl.it/@SITUVNgcd/ThreadPool.
  2. ThreadPool: hướng dẫn: http://www.learncsharptutorial.com/threadpooling-csharp-example.php
5 Likes

Bạn có thể start xong tất cả thread, dùng thêm 1 vòng lặp nữa chạy thread.join là ok mà

5 Likes

em cũng mới làm bằng vòng lặp được rồi, cảm ơn bác nhiều, để em thử cái threadPool xem sao

Mình thường sủ dụng theadPool kết hợp callback.

Hoặc viết nó theo cách thô sơ nhất:

boolean[] threadFinished = new boolean[]{ false };
Thread myTheard = new Thread(
    () -> {
              ...
              threadFinished[0] = true;
          });
myThread.start();
while(!threadFinished[0])
{
    //do nothing
}
//next code

Sorry cả nhà, nãy em ngáo ngáo nên code nhầm ngôn ngữ :smile:

var threadFinished = false;
var myThread = new Thread(() =>
    {
        ...
        threadFinished = true;
    });

myThread.Start();
while (!threadFinished) ;//do nothing

//nextCode
5 Likes

Đoạn trên https://repl.it/@SITUVNgcd/ThreadPool, mình sửa vòng lặp lại:

    for(int i = 0; i < n; i++){
      if(t[i].ThreadState != ThreadState.Stopped) i--;
    }
4 Likes

Nếu main thread mà phải đợi thread con sao không cho nó vào main luôn ???

4 Likes

vì bạn ấy muốn làm nhiều việc song song cùng 1 lúc thay vì làm lần lượt từng việc. Nhưng lại vẫn muốn đợi khi nào xong hết việc thì mới kết thúc chương trình

4 Likes

cách dùng vòng lặp này chỉ giải quyết được việc nhưng có vẻ sẽ tốn tài nguyên CPU cho việc check lắm

4 Likes

Thế thì dùng vòng lặp để khởi động.
Sau đó check IsAlive của tất cả các thread hoặc set cờ.
Sợ tốn tài nguyên thì cứ cho Thread.Sleep vào mỗi chu kỳ lặp.

4 Likes
for (int i = 0; i < numThreads; i++)
        {
            Thread mycorner = new Thread(new ThreadStart(DoSomeThing));
            mycorner.Name = String.Format("Thread{0}", i + 1);
            mycorner.Start();
        } 

chuyển thành

Parallel.For(0, numThreads, i=> DoSomeThing(i));

rồi gom lại thành Task

await Task.Factory.StartNew(()=> Parallel.For(0, numThreads, i=> DoSomeThing(i)));

C# mà cứ viết theo cách của cpp thế.
Tham khảo khi nào dùng thread khi nào Task tại C# Corner

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?