.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);
    }
}

posted on 2012-11-30 13:08  shwang  阅读(189)  评论(0)    收藏  举报