小妖女 发表于 2015-1-16 22:34:33

ASP.NET网站制作之风趣的多线程编程(3)――线程外部是如...

因为各系统的API不同,代码调用API编写程序就会遇到很多不兼容的地方,比如Java改写后的Serv-U就不能在手机上执行,手机的游戏也不能直接在微机上执行。编程|多线程看一下以下两个例子的运转了局:
//TestThread.cs
usingSystem;usingSystem.Threading;publicclassTest{staticintcount=0;staticvoidMain(){ThreadStartjob=newThreadStart(ThreadJob);Threadthread=newThread(job);thread.Start();for(inti=0;i<5;i++){count++;}thread.Join();Console.WriteLine("Finalcount:{0}",count);}staticvoidThreadJob(){for(inti=0;i<5;i++){count++;}}}//InnerDataThread.csusingSystem;usingSystem.Threading;publicclassTest{staticintcount=0;staticvoidMain(){ThreadStartjob=newThreadStart(ThreadJob);Threadthread=newThread(job);thread.Start();for(inti=0;i<5;i++){inttmp=count;Console.WriteLine("Readcount={0}",tmp);Thread.Sleep(50);tmp++;Console.WriteLine("Incrementedtmpto{0}",tmp);Thread.Sleep(20);count=tmp;Console.WriteLine("Writtencount={0}",tmp);Thread.Sleep(30);}thread.Join();Console.WriteLine("Finalcount:{0}",count);}staticvoidThreadJob(){for(inti=0;i<5;i++){inttmp=count;Console.WriteLine("                                Readcount={0}",tmp);Thread.Sleep(20);tmp++;Console.WriteLine("                                Incrementedtmpto{0}",tmp);Thread.Sleep(10);count=tmp;Console.WriteLine("                                Writtencount={0}",tmp);Thread.Sleep(40);}}}Readcount=0Readcount=0Incrementedtmpto1Writtencount=1Incrementedtmpto1Writtencount=1Readcount=1Incrementedtmpto2Readcount=1Writtencount=2Readcount=2Incrementedtmpto2Incrementedtmpto3Writtencount=2Writtencount=3Readcount=3Readcount=3Incrementedtmpto4Incrementedtmpto4Writtencount=4Writtencount=4Readcount=4Readcount=4Incrementedtmpto5Writtencount=5Incrementedtmpto5Writtencount=5Readcount=5Incrementedtmpto6Writtencount=6Finalcount:6再对照上面这个例子:
//利用Monitor.Enter/Exit
//MonitorThread.cs

usingSystem;
usingSystem.Threading;

publicclassTest
{
staticintcount=0;
staticreadonlyobjectcountLock=newobject();

staticvoidMain()
{
ThreadStartjob=newThreadStart(ThreadJob);
Threadthread=newThread(job);
thread.Start();

for(inti=0;i<5;i++)
{
Monitor.Enter(countLock);
inttmp=count;
Console.WriteLine("Readcount={0}",tmp);
Thread.Sleep(50);
tmp++;
Console.WriteLine("Incrementedtmpto{0}",tmp);
Thread.Sleep(20);
count=tmp;
Console.WriteLine("Writtencount={0}",tmp);
Monitor.Exit(countLock);
Thread.Sleep(30);
}

thread.Join();
Console.WriteLine("Finalcount:{0}",count);
}

staticvoidThreadJob()
{
for(inti=0;i<5;i++)
{
Monitor.Enter(countLock);
inttmp=count;
Console.WriteLine("                                Readcount={0}",tmp);
Thread.Sleep(20);
tmp++;
Console.WriteLine("                                Incrementedtmpto{0}",tmp);
Thread.Sleep(10);
count=tmp;
Console.WriteLine("                                Writtencount={0}",tmp);
Monitor.Exit(countLock);
Thread.Sleep(40);
}
}
}

了局与上例InnerDataThread.cs是纷歧样的,缘故原由就在于Monitor的利用了。
Readcount=0Incrementedtmpto1Writtencount=1Readcount=1Incrementedtmpto2Writtencount=2Readcount=2Incrementedtmpto3Writtencount=3Readcount=3Incrementedtmpto4Writtencount=4Readcount=4Incrementedtmpto5Writtencount=5Readcount=5Incrementedtmpto6Writtencount=6Readcount=6Incrementedtmpto7Writtencount=7Readcount=7Incrementedtmpto8Writtencount=8Readcount=8Incrementedtmpto9Writtencount=9Readcount=9Incrementedtmpto10Writtencount=10Finalcount:10
上面利用lock来锁定线程:
//LockThread.cs
usingSystem;
usingSystem.Threading;

publicclassTest
{
staticintcount=0;
staticreadonlyobjectcountLock=newobject();

staticvoidMain()
{
ThreadStartjob=newThreadStart(ThreadJob);
Threadthread=newThread(job);
thread.Start();

for(inti=0;i<5;i++)
{
lock(countLock)
{
inttmp=count;
Console.WriteLine("Readcount={0}",tmp);
Thread.Sleep(50);
tmp++;
Console.WriteLine("Incrementedtmpto{0}",tmp);
Thread.Sleep(20);
count=tmp;
Console.WriteLine("Writtencount={0}",tmp);
}
Thread.Sleep(30);
}

thread.Join();
Console.WriteLine("Finalcount:{0}",count);
}

staticvoidThreadJob()
{
for(inti=0;i<5;i++)
{
lock(countLock)
{
inttmp=count;
Console.WriteLine("                                Readcount={0}",tmp);
Thread.Sleep(20);
tmp++;
Console.WriteLine("                                Incrementedtmpto{0}",tmp);
if(count<100)
thrownewException();
Thread.Sleep(10);
count=tmp;
Console.WriteLine("                                Writtencount={0}",tmp);
}
Thread.Sleep(40);
}
}
}

了局怎样?与MonitorThread.cs对照一下,再想一想看。
因为各系统的API不同,代码调用API编写程序就会遇到很多不兼容的地方,比如Java改写后的Serv-U就不能在手机上执行,手机的游戏也不能直接在微机上执行。

金色的骷髅 发表于 2015-1-19 16:58:17

ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。

飘灵儿 发表于 2015-1-19 16:58:17

这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。

再现理想 发表于 2015-1-25 15:57:31

这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。

山那边是海 发表于 2015-2-3 06:04:46

现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。

谁可相欹 发表于 2015-2-8 19:55:48

网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!

兰色精灵 发表于 2015-2-26 00:46:48

网页从开始简单的hmtl到复杂的服务语言,走过了10多个年头,各种技术层出不穷,单个的主流技术也在不断翻新的版本,现在分析下各种语言的区别、优势、劣势、开发注意事项!

透明 发表于 2015-3-8 10:59:22

CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。

再见西城 发表于 2015-3-15 22:23:33

ASP.net的速度是ASP不能比拟的。ASP.net是编译语言,所以,当第一次加载的时候,它会把所有的程序进行编译(其中包括worker进程,还有对语法进行编译,形成一个程序集),当程序编译后,执行速度几乎为0。
页: [1]
查看完整版本: ASP.NET网站制作之风趣的多线程编程(3)――线程外部是如...