在说C#中的System.Threading之前,先来简单说说Process, Thread, CPU, 和OS。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
// 第一个控制台程序
namespace LearnThread
{
class Program
{
static void subTask()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("subTask is running");
}
}
static void Main(string[] args)
{
subTask();
for (int i = 0; i < 5; i++ )
{
Console.WriteLine("main is running");
}
Console.ReadLine();
}
}
}
subTask is running
subTask is running
subTask is running
subTask is running
subTask is running
main is running
main is running
main is running
main is running
main is running
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
// 第二个控制台程序
namespace LearnThread
{
class Program
{
static void subTask()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine("subTask is running");
}
}
static void Main(string[] args)
{
// create one thread
Thread t = new Thread(new ThreadStart(subTask));
// invoke this thread
t.Start();
for (int i = 0; i < 5; i++ )
{
Console.WriteLine("main is running");
}
Console.ReadLine();
}
}
}
在运行subTask这个thread的时候,并不是运行到结束再执行main中的for循环,而是交替执行,类似Simultaneous multithreading,运行结果为(结果随机)
subTask is running
main is running
main is running
subTask is running
subTask is running
main is running
subTask is running
subTask is running
main is running
main is running
可见,System.Threading命名空间中的Thread类可以帮助我们实现程序中的并行。
namespace LearnThread
{
class Program
{
static void Main(string[] args)
{
// A thread will be created to run
// function1 parallely
Thread obj1 = new Thread(Function1);
obj1.IsBackground = true;
obj1.Start();
// the control will come here and exit the main function
Console.WriteLine("The main application has exited");
}
static void Function1()
{
Console.WriteLine("Function 1 entered");
// wait here until the user put any input
Console.ReadLine();
Console.WriteLine("Function 1 is exited");
}
}
}
程序的运行结果为:
The main application has exited
Function 1 entered
hello
Function 1 exited
Press any key to continue . . .
可见,虽然主程序结束了,foreground thread依然会等待用户输入,在用户输入hello之后,执行最后一句,退出
namespace LearnThread
{
class Program
{
static void Main(string[] args)
{
// A thread will be created to run
// function1 parallely
Thread obj1 = new Thread(Function1);
obj1.IsBackground = true;
obj1.Start();
// the control will come here and exit the main function
Console.WriteLine("The main application has exited");
}
static void Function1()
{
Console.WriteLine("Function 1 entered");
// wait here until the user put any input
Console.ReadLine();
Console.WriteLine("Function 1 is exited");
}
}
}
改程序的输出结果为:
The main application has exited
Function 1 entered
Press any key to continue . . .
可见,主程序退出后,background thread也结束了,没有再等待用户输入
Random o = new Random();
for (long i = 0; i < 10000; i++)
{
Num1 = o.Next(1, 2);
Num2 = o.Next(1, 2);
int result = Num1/Num2;
Num1 = 0;
Num2 = 0;
}
在.NET中提供的解决方案:
Lock
Mutex
Semaphore
比如,使用lock修改后的程序
Random o = new Random();
for (long i = 0; i < 10000; i++)
{
lock (this)
{
Num1 = o.Next(1, 2);
Num2 = o.Next(1, 2);
int result = Num1/Num2;
Num1 = 0;
Num2 = 0;
}
}