QQ : 1841545843
邮箱 : jiaxx903@163.com
C#线程介绍(一)
-
- 线程被定义为可执行程序中的基本执行单元。
// 获取正在当前线程的应用程序
AppDomain ad = Thread.GetDomain();
// 获取当前操作线程所处的上下文
Context ctx = Thread.CurrentContext;
-
- 异步委托
委托在单独的线程上调用方法,以便模拟多个“同时”的任务。C#编译器在处理delegate的时候默认定义了两个方法———BeginInvoke(), EndInvoke().
- 异步委托
// 用于调用异步方法
public IAsyncResult BeginInvoke(int x, int y, AsyncCallback cb, object state)
// 用于获取被调用方法的返回值
public int EndInvoke(IAsyncResult result)
-
- 同步调用
IAsyncResult接口提供了IsCompleted属性,能够判断线程在调用EndInvoke之前,判断异步调用是否真正完成。回调方法在此线程而不是主线程中调用。
异步委托最后一个参数允许从主线程传递额外的状态信息返回给回调方法。
- 同步调用
-
- System.Threading 命名空间
Interlocked 为被多个线程共享访问的类提供原子操作
-
- Thread类
CurrentContext 返回当前线程上下文
CurrentThread 返回当前线程引用
GetDomain() / GetDomainID 返回当前应用程序的引用,或当前正在运行线程的ID
Sleep() 将当前线程挂起指定的时间
-
- AutoResetEvent类
一个简单的线程安全的方法是使用AutoResetEvent类,强制线程等待,直到其他线程结束。在需要等待的线程中创建该类的实例,想=向构造函数传入false,表示尚未收到通知。然后在需要等待的地方调用WaitOne()方法。
- AutoResetEvent类
// 在需要等待的地方创建,
// 向构造函数中传入false,表示尚未收到信息
private static AutoResetEvent waitHandle = new AutoResetEvent(false);
static void Mian()
{
......
Thread t = new Thread(new ParameterizedThreadStart(Add));
t.start(ap);
// 等待, 直到收到通知
waitHandle.WaitOne();
......
}
static void Add(Object data)
{
......
Addparams ap = (Addparam)data;
// 通知其他线程,该线程已经结束
waitHandle.set()
......
}
-
- lock关键字进行同步
lock允许定义一段线程同步的代码语句,后进入的线程不会终止当前的线程,而是停止自身下一步的执行。lock需要定义一个标记,线程进入锁定范围的时候必须获得这个标记。
- lock关键字进行同步
// 锁标志
private object threadlock = new object();
public void PrimeNumbers()
{
// 使用锁标志
lock(threadlock)
{
......
}
}
-
- 使用 Sysyem.Threading.Monitor
C#lock实际上使用的是System.Threading.Monitor类的速记比表示符号。经过编译器处理转换为如下内容:
- 使用 Sysyem.Threading.Monitor
public void PrintNumbers()
{
Monitor.Enter(threadlock)
try
{
......
}
// 保证无论出现什么错误,线程都能被释放
finally
{
Monitor.Exit(threadlock);
}
......
}
使用Monitor.Wait()
方法指示活动的线程等待一段时间,在当前线程完成操作时,使用Monitor.Pulse() / Monitor.PulseAll()
通知等待中的线程。
-
- [Synchronization]特性
这个类级别的特性有效的是对象的所有实例成员都保持线程安全。
- [Synchronization]特性
-
- Task类
Task类可以轻松的在次线程中调用方法,可以作为异步委托的替代品。
- Task类
private void btnProcessImages(object sendwe, EventArgs e)
{
// 启动一个新的任务来处理文件
Task.Factory.StartNew( () =>
{
Process();
.....
});
}