.net 多线程培训总结
0. 不要lock(string),string每次都不同(字符串池等)...
Lock是Monitor的升级版
1.基本语法
Thread writer = new Thread (new ThreadStart (WriterFunc));
writer.Start().
2.IsBackground
如果是后台线程,即便该线程在运行中,也会随主线程的关闭而强制停止;相反,如果有前台线程在运行中,则主线程无法停止,必须等所有前台线程停止后才能停止。
线程默认为前台线程。
3.线程事件AutoResetEvent、ManualResetEvent
//AutoResetEvent
//调用WaitOne之后,系统会自动重设--两个线程通知
//ManualResetEvent
//则需要线程自己调用事件的Reset方法--多个线程通知
AutoResetEvent的method:
WaitOne();//阻塞 Set();// 取消阻塞 Close();//关闭
a.某线程调用manualEvent.WaitOne()后,必须等manualEvent释放状态才能继续run(等待manualEvent.Set())。
b.manualEvent.Set()将阻塞Event,使等待调用manualEvent的线程阻塞。
c.WaitHandle.WaitAll(autoEvents),(其中autoEvents是一个manualEvent的数组),将等autoEvents全部释放状态下才能继续run当前的线程。
d.如果没有调用 WaitOne()或者WaitAll,则不受阻塞影响,否则要等对应的Event释放
http://hi.baidu.com/herakles_key/item/48b5c0ccf3d5663b99b498dd
4. Interlocked.Increment(ref ***)/Interlocked.Decrement(ref ***)用以线程安全的自增或自减
5. Mutex:进程间通信控制
Mutex mut = new Mutex();
mut.WaitOne();
mut.ReleaseMutex();
6. ThreadPool
ThreadPool.QueueUserWorkItem(***)
7. 线程取消CancellationTokenSource
CancellationTokenSource cts = new CancellationTokenSource();
// 支持取消
ThreadPool.QueueUserWorkItem(o => Count(cts.Token, 1000));
cts.Cancel(); //发出取消通知
private static void Count(CancellationToken token,Int32 countTo)
{...}
8. 上下文数据CallContext
CallContext.LogicalSetData("Name", "Jason");
CallContext.LogicalGetData("Name")
ExecutionContext.SuppressFlow();
ExecutionContext.RestoreFlow();
9. 读写锁ReaderWriterLock
//Reader-Writer锁
static ReaderWriterLock rwlock = new ReaderWriterLock ();
// 获取Reader锁
rwlock.AcquireReaderLock(Timeout.Infinite);
//释放Reader锁
rwlock.ReleaseReaderLock();
//获取Writer锁
rwlock.AcquireWriterLock(Timeout.Infinite);
//释放Writer锁
rwlock.ReleaseWriterLock();
10. VS2012的await/Task
11. Timer
System.Windows.Threading.DispatcherTimer timer = new DispatcherTimer();
timer.Interval = TimeSpan.FromMilliseconds(500);
//这里对WPF控件的更新,
//DispatcherTimer会正确交给UI线程来实现
timer.Tick +=
new EventHandler(delegate(object s, EventArgs a)
{
this.textBox1.Text = string.Format(
"Timer Ticked: {0}ms", Environment.TickCount);
});
timer.Start();
12. Parellel
Parallel.For(0, employeeData.Count, i =>
{
Console.WriteLine("Starting process for employee id {0}",
Parallel.ForEach(employeeData, ed =>
{
Console.WriteLine("Starting process for employee id {0}",
ed.EmployeeID);
......
Parallel.Invoke(delegate { WalkTree(node.Left); },
delegate { WalkTree(node.Right); });
13. Task.ContinueWith
Task task3 = Task.Factory.StartNew(delegate
{ PayrollServices.GetPayrollDeduction(employeeData[0]); })
.ContinueWith(delegate
{ PayrollServices.GetPayrollDeduction(employeeData[1]); })
.ContinueWith(delegate
{ PayrollServices.GetPayrollDeduction(employeeData[2]); });
task3.Wait();
14. Linq
static void Ex4Task1_PLINQ()
{
var q = Enumerable.Select(
Enumerable.OrderBy(
Enumerable.Where(employeeData,
x => x.EmployeeID % 2 == 0),
x => x.EmployeeID),
x => PayrollServices.GetEmployeeInfo(x))
.ToList();
foreach (var e in q)
{
Console.WriteLine(e);
}
}
浙公网安备 33010602011771号