C#多线程基础知识汇总
什么是多线程?
多线程指在同一个程序中运行多个线程,每个线程独立运行,在不同线程中可以并发执行任务,从而提高程序运行效率。
多线程的优点和缺点
优点
- 提高程序运行效率;
- 更好地利用CPU资源。
缺点
- 多线程会增加程序的复杂性;
- 多线程的调试和维护比较困难;
- 多线程容易引起死锁和数据访问冲突等问题。
多线程的实现方式
继承Thread类实现多线程
继承Thread类,重写Run方法,并在程序中创建Thread实例,并通过Start方法启动线程。
using System.Threading;
public class MyThread : Thread
{
public void Run()
{
Console.WriteLine("Thread running...");
}
}
实现IAsyncResult接口实现多线程
实现IAsyncResult接口,重写BeginInvoke和EndInvoke方法,用于启动和结束线程。
public delegate int MyDelegate(int a, int b);
class Program
{
static int Add(int a, int b)
{
Console.WriteLine("Add method running in thread {0}.", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000); // 模拟耗时操作
return a + b;
}
static void Main(string[] args)
{
MyDelegate del = Add;
IAsyncResult ar = del.BeginInvoke(1, 2, r =>
{
int result = del.EndInvoke(r);
Console.WriteLine("Result: {0}", result);
}, null);
Console.WriteLine("Main thread running...");
Console.ReadKey();
}
}
多线程的同步
互斥锁Mutex
互斥锁Mutex可以保证在同一时刻只能有一个线程访问或执行某一段代码,从而避免了数据访问冲突的问题。
using System.Threading;
class Program
{
private static Mutex mutex = new Mutex();
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
Thread thread = new Thread(() =>
{
mutex.WaitOne();
Console.WriteLine("Thread {0} is running.", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000); // 模拟耗时操作
mutex.ReleaseMutex();
});
thread.Start();
}
Console.ReadKey();
}
}
AutoResetEvent和ManualResetEvent
AutoResetEvent和ManualResetEvent都可以实现线程之间的同步。
AutoResetEvent自动重置事件的功能是,当一个线程调用Set方法后,只有等待该事件的线程会被唤醒,且该事件会自动重置,等待该事件的线程再次调用WaitOne方法时会被阻塞。
using System.Threading;
class Program
{
private static AutoResetEvent autoResetEvent = new AutoResetEvent(false);
static void Main(string[] args)
{
for (int i = 1; i <= 10; i++)
{
Thread thread = new Thread(() =>
{
Console.WriteLine("Thread {0} is waiting.", i);
autoResetEvent.WaitOne();
Console.WriteLine("Thread {0} is running.", i);
});
thread.Start();
}
Thread.Sleep(5000);
autoResetEvent.Set(); // 只有一个线程会被唤醒
Console.ReadKey();
}
}
ManualResetEvent手动重置事件的功能是,当一个线程调用Set方法后,等待该事件的所有线程都会被唤醒,该事件不会自动重置,需要在代码中调用Reset方法来进行重置。
using System.Threading;
class Program
{
private static ManualResetEvent manualResetEvent = new ManualResetEvent(false);
static void Main(string[] args)
{
for (int i = 1; i <= 10; i++)
{
Thread thread = new Thread(() =>
{
Console.WriteLine("Thread {0} is waiting.", i);
manualResetEvent.WaitOne();
Console.WriteLine("Thread {0} is running.", i);
});
thread.Start();
}
Thread.Sleep(5000);
manualResetEvent.Set(); // 所有等待的线程都会被唤醒
Console.ReadKey();
}
}
总结
C#多线程是提高程序性能的有效手段,但在实现过程中需要注意线程同步的问题,避免死锁和数据访问冲突等问题的出现。熟练掌握多线程的实现方式和同步机制,可以使程序运行更加高效和稳定。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#多线程基础知识汇总 - Python技术站