C#多线程中如何等待所有线程的任务都执行完成呢?在.net 4.0以4.0+中,有Task.WaitAll(params Task[] tasks)方法来等待所有Task[],而不需要更多的操作。按照微软官方的文档,我写了一个实例来调试和说明:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApp
{
class Program
{
static void Main(string[] args)
{
var bookShop = new BookShop();
bookShop.Run();
}
}
pulic class Book
{
public int Id { get; set; }
public string Name { get; set; }
}
public class BookShop
{
Random rand = new Random();
Queue<Book> queueBook = new Queue<Book>();
int Max = 10000;
int EachCount = 500;
int Cur = 0;
void LoadData()
{
if (Cur >= Max)
{
//when Cur>=Max,return
Console.WriteLine("Reached max value!");
return;
}
Console.WriteLine("Loading data...");
for (int i = Cur; i < EachCount + Cur; i++)
{
Thread.Sleep(10);
Console.Write(i + " ");
//insert data into Queue<Book>
queueBook.Enqueue(new Book { Id = i, Name = "Name_" + i });
}
Console.WriteLine("");
Cur += EachCount;
Console.WriteLine("Data loaded successful,{0}...", queueBook.Count);
}
public void Run()
{
LoadData();
Console.WriteLine("Tasks have started...");
do
{
Task[] tasks = new Task[10];
for (int i = 0; i < 10; i++)
{
tasks[i] = Task.Factory.StartNew(() => DoSomeWork(1000 * 1));
}
//// Wait for all tasks to complete.
Task.WaitAll(tasks);
//when Queue<Book> is empty,reload data...
LoadData();
} while (queueBook.Count > 0);
//when Cur>=Max,break the while loop
Console.WriteLine("All tasks have completed.");
Console.ReadKey();
}
void DoSomeWork(int val)
{
while (queueBook.Count > 0)
{
var m = queueBook.Dequeue();
Console.WriteLine("DoSomeWork start,i={0},Current thread id:{1}...", m.Id, Thread.CurrentThread.ManagedThreadId);
var sleep = rand.Next(10, 200);
// Pretend to do something.
Thread.Sleep(sleep);
Console.WriteLine("DoSomeWork has completed,sleep:{0},i={1}", sleep, m.Id);
}
}
}
}
版权声明:本作品系原创,版权归码友网所有,如未经许可,禁止任何形式转载,违者必究。
发表评论
登录用户才能发表评论, 请 登 录 或者 注册