C#线程介绍(一)

QQ : 1841545843
邮箱 : jiaxx903@163.com

C#线程介绍(一)

    1. 线程被定义为可执行程序中的基本执行单元。
// 获取正在当前线程的应用程序
AppDomain ad = Thread.GetDomain();

// 获取当前操作线程所处的上下文
Context ctx = Thread.CurrentContext;
    1. 异步委托
      委托在单独的线程上调用方法,以便模拟多个“同时”的任务。C#编译器在处理delegate的时候默认定义了两个方法———BeginInvoke(), EndInvoke().
// 用于调用异步方法
public IAsyncResult BeginInvoke(int x, int y, AsyncCallback cb, object state)

// 用于获取被调用方法的返回值
public int EndInvoke(IAsyncResult result)
    1. 同步调用
      IAsyncResult接口提供了IsCompleted属性,能够判断线程在调用EndInvoke之前,判断异步调用是否真正完成。回调方法在此线程而不是主线程中调用。
      异步委托最后一个参数允许从主线程传递额外的状态信息返回给回调方法。
    1. System.Threading 命名空间
Interlocked                 为被多个线程共享访问的类提供原子操作
    1. Thread类
CurrentContext       返回当前线程上下文
CurrentThread        返回当前线程引用
GetDomain() / GetDomainID    返回当前应用程序的引用,或当前正在运行线程的ID
Sleep()              将当前线程挂起指定的时间
    1. AutoResetEvent类
      一个简单的线程安全的方法是使用AutoResetEvent类,强制线程等待,直到其他线程结束。在需要等待的线程中创建该类的实例,想=向构造函数传入false,表示尚未收到通知。然后在需要等待的地方调用WaitOne()方法。
	// 在需要等待的地方创建,
	// 向构造函数中传入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()
	......
}
    1. lock关键字进行同步
      lock允许定义一段线程同步的代码语句,后进入的线程不会终止当前的线程,而是停止自身下一步的执行。lock需要定义一个标记,线程进入锁定范围的时候必须获得这个标记。
//  锁标志
private object threadlock = new object();

public void PrimeNumbers()
{
	// 使用锁标志
	lock(threadlock)
	{
	 	......
	}
}
    1. 使用 Sysyem.Threading.Monitor
      C#lock实际上使用的是System.Threading.Monitor类的速记比表示符号。经过编译器处理转换为如下内容:
public void PrintNumbers()
{
	Monitor.Enter(threadlock)
	try
	{
		......	
	}
	
	// 保证无论出现什么错误,线程都能被释放
	finally
	{
		Monitor.Exit(threadlock);
	}
	......	
}

使用Monitor.Wait()方法指示活动的线程等待一段时间,在当前线程完成操作时,使用Monitor.Pulse() / Monitor.PulseAll()通知等待中的线程。

    1. [Synchronization]特性
      这个类级别的特性有效的是对象的所有实例成员都保持线程安全。
    1. Task类
      Task类可以轻松的在次线程中调用方法,可以作为异步委托的替代品。
private void btnProcessImages(object sendwe, EventArgs e)
{
	// 启动一个新的任务来处理文件
	Task.Factory.StartNew( () =>
	{
		Process();
		.....
	});
}
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值