C# 异步编程(1)

1、using System.Threading;

thread1.Start();  开始线程

thread1.Name ="" 线程名只能赋值一次

Thread.CurrentThread.Name   当前线程名

thread1.Join() 参数可以为毫秒也可以为TimeSpan,运行thread1线程,当有参数时如果超时返回False

Thread.Sleep() 参数可以为毫秒也可以为TimeSpan,Thread.Sleep(0)这样调用会导致线程立即放弃本身当前的时间片,自动将cpu移交给其他线程。

Thread.Yield() 做同样的事,但是它只会把执行交给同一处理器上的其他线程

2、阻塞(Blocking)

当等待Sleep或Join,线程处于阻塞状态;

thread1.ThreadState 当前线程状态

可以通过ThreadState这个属性来判断线程是否处于阻塞的状态

bool blocked = (someThread.ThreadState & ThreadState.WaitSleepJoin) != 0;

ThreadState最有用的四个枚举值是:

Unstarted,Running,WaitSleepJoin,Stopped

/*如果是ThreadState.Unstart | ThreadState.WaitSleppJoin |ThreadState.Stopped 则返回这些状态
否则就是Running状态*/

public
static ThreadState SimpleThreadState (ThreadState ts) { return ts & (ThreadState.Unstart | ThreadState.WaitSleppJoin | ThreadState.Stopped); }

3、解除阻塞

当满足下面四种情况时,就会解除阻塞

1、阻塞条件被满足

2、操作超时(如果设置超时的话)

3、通过Thread.Interrupt()进行打断

4、通过Thread.Abort()进行中止;

4、阻塞和忙等待(自旋) Blocking vs Spinning

IO-bound操作的工作方式有两种:

在当前线程上同步的等待:Console.ReadLine() ,Thread.Sleep(), Thread.Join()...

异步的操作,在稍后操作完成时触发一个回调动作。

同步等待的I/O-bound操作将大部分时间花在阻塞线程上。

他们也可以周期性的在一个循环里进行“打转(自旋)”

while(DateTime.Now < nextStartTime)

Thread.Sleep(100);

while (DateTime.Now < nextStartTime);

原文地址:https://www.cnblogs.com/zuiailiuruoying/p/14791783.html