.Net线程学习手记(1)

原创 2004年09月17日 09:47:00

  线程确实是一个好东西,可以让你可以同时作多个不同的处理。

  .Net中新增了一个隔离层,称为应用程序域(AppDomain),它是进程内部一个逻辑独立部分。在一个进程中可以存在多个应用程序域。应用程序域可以保存一个或多个线程,就像进程一样。不同之处在于:应用程序域可以在进程内部创建,但不创建新线程。

  目前的一个问题是:线程可以跨多个应用程序域来执行,为什么?回头再看。

  好的,看看AppDomain的例子吧:appdomain.cs

using System;

public class MyAppDomain

{

  public AppDomain Domain;

  public int ThreadId;

  public void SetDomainData(string vName, string vValue)

  {

    Domain.SetData(vName, (object)vValue);

    ThreadId=AppDomain.GetCurrentThreadId();

  }

 

  public string GetDomainData(string name)

  {

    return (string)Domain.GetData(name);

  }

 

  public static void Main()

  {

    string DataName=“MyData“;

    string DataValue=“Some Data to be stored“;

    Console.WriteLine(“Retrieving current domain“);

    MyAppDomain Obj=new MyAppDomain();

    Obj.Domain=AppDomain.CurrentDomain;

    Console.WriteLine(“Setting domain data“);

    Obj.SetDomainData(DataName, DataValue);

    Console.WriteLine(“Getting domain data“);

    Console.WriteLine(“The Data found for key'“ + DataName + “'is'“ + Obj.GetDomainData(DataName) + “'running on threadid:“ + Obj.ThreadId);

  }

}

  这个不难理解,应该就是新建了一个AppDomain变量,使它引用当前Domain,所以对于Obj上Domain的引用也就相当于对当前Domain的引用。

  关键是在指定的应用程序域中执行代码,需要注意的是其两个的ThreadId都相同!!!

using System;

 

public class CreateAppDomains

{

    public static void Main()

    {

      AppDomain DomainA;

      DomainA=AppDomain.CreateDomain(”MyDomainA”);

      string StringA=”DomainA Value”;

      DomainA.SetData(”DomainKey”, StringA);

      CommonCallBack();

      CrosAppDomainDelegate delegateA=new CrossAppDomainDelegate(CommonCallBack);

      DomainA.DoCallBack(delegateA);

  }

  public static void CommonCallBack()

  {

    AppDomain Domain;

    Domain=AppDomain.CurrentDomain;

    Console.WriteLine(“The value'“+Domain.GetData(“DomainKey“)+“'was found in “+Domain.FriendlyName.ToString()+“running on thread id:“+AppDomain.GetCurrentThreadId().ToString());

  }

}

运行结果为:

The Value ''was found in create_appdomain.exe running on thread id: 1372

The Value 'DomainA Value' was found in MyDomainA running on thread id:1372

  写到这里,突然也明白了线程可以跨多个AppDomain访问的原因。首先这里的主程序应该是一个线程,这个应该没有问题,然后其实就是顺序执行了一个过程而已,在这个过程中,创建了一个AppDomain类然后又调用的他的方法。所以线程Id应该就是一样的。

  另外就是让代码在指定的AppDomain中执行,就需要用到AppDomain的DoCallBack()方法,该方法需要使用CrossAppDomainDelegate的实例作为一个参数,呵呵,有点像函数指针。

树莓派学习手记——修改软件源

树莓派rasbian修改软件源
  • z1449656965
  • z1449656965
  • 2018年01月06日 16:54
  • 50

[随手记经验] 【转载】其实你不懂记账

这些问题你都能立马回答出来吗?  1、你的资产负债率是多少?  2、你的收支结余比例是多少?  3、上个月结余的钱都放在什么地方了?  4、目前你手上有多少可动用资金?  5、你的股票、基金等投资收益...
  • fishmai
  • fishmai
  • 2016年09月01日 12:58
  • 1045

《IT项目经理成长手记》读后有所思

最近看了一本潘东、韩秋泉先生合著的一本书《IT项目经理成长手记》,虽然与IT项目经理相关的书我看的不多,对于这个行业了解也不算太多,但是我依然认为这是一本很值得想要从事互联网产品、通信行业解决方案管理...
  • u013816144
  • u013816144
  • 2016年06月20日 21:53
  • 3637

reactjs学习手记(1)

react课程概要什么是React开发背景facebook推出的,需要解决的问题 构建数据不断变化的大型应用 数据变化-->大量dom操作 -->逻辑变化简单 声...
  • rayshaw001
  • rayshaw001
  • 2016年11月26日 18:22
  • 214

nodejs学习手记(1)

nodejs
  • rayshaw001
  • rayshaw001
  • 2016年11月26日 18:20
  • 77

Linux.NET学习手记(1)

Linux下面跑.NET程序,听起来有点疯狂,不过又是那么的有前途。Linux作为服务器,它的优势是不容置疑的,可以说类Unix系统(Linux、Unix……)天生就是适合做为服务器的操作系统,它的稳...
  • zhang355
  • zhang355
  • 2015年09月09日 22:35
  • 196

深度学习(三十六)异构计算CUDA学习笔记(1)

异构计算CUDA学习笔记(1) 原文地址:http://blog.csdn.net/hjimce/article/details/51506207 作者:hjimce 近日因为感觉自己在深...
  • haoji007
  • haoji007
  • 2016年10月17日 10:29
  • 299

【.NET线程--进阶(一)】--线程方法详解

线程的优缺点决定了在开发过程中是否使用多线程,另外灵活运行单线程的方法来实现灵活的控制线程,两个Demo使用了线程的基本方法,能够更加深刻的了解它们的使用。线程和线程之间的调用关系,以及如何实现线程间...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2014年02月07日 09:18
  • 4643

Linux.NET学习手记(1)

Linux下面跑.NET程序,听起来有点疯狂,不过又是那么的有前途。Linux作为服务器,它的优势是不容置疑的,可以说类Unix系统(Linux、Unix……)天生就是适合做为服务器的操作系统,它的稳...
  • dyllove98
  • dyllove98
  • 2013年04月04日 21:45
  • 1589

JavaScript学习手记1

适合初学者看的博客,主要是一些基础知识,内容比较杂。希望能够有更多的人参与分享,如果有什么写的不准确的希望指正。...
  • LittleBirdisflying
  • LittleBirdisflying
  • 2015年11月15日 00:34
  • 198
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:.Net线程学习手记(1)
举报原因:
原因补充:

(最多只允许输入30个字)