当前位置:首页 » 编程软件 » net编程模式

net编程模式

发布时间: 2025-01-18 13:54:20

㈠ 什么是.net编程

.Net是一种编程框架,它提供了一个高层次的抽象,使开发人员能够在掌握一定基础编程知识的情况下,更容易地开发产品。.Net框架是用于开发应用软件和托管类库的平台,它包含了编译器和工具,支持在生成、调试及执行托管应用程序时所需的功能。

在.NET框架中,应用程序被称为“托管”,这意味着它们的执行是由.NET框架管理的,提供了如应用程序加载、内存管理、安全性和资源完整性等服务。.Net框架通过提供一个受控的运行时环境来管理这些执行过程,确保应用程序在运行时能够正常工作。

在.NET框架出现之前,如C++和VB6等编程语言所处的环境中,操作系统中没有提供类似.NET框架的服务,应用程序需要自行管理内存和安全性等,这可能导致错误代码、安全漏洞以及数据丢失等问题。

.Net框架提供了丰富的工具,包括编译器、调试器、多种编程语言、执行引擎(即Common Language Runtime, CLR)、开发工具及大量的预定义类库(Framework Class Libraries, FCLs)。FCLs提供了广泛的功能模块,可以满足开发人员的不同需求。

此外,.Net支持多种编程语言,包括VB.NET、J#、C#、F#等,所有编程语言最终都将由CLR执行,因此.Net是“语言无关”的。现在,微软还推出了支持托管.Net编程的VC++版本。

凭借.Net框架的强大功能,.Net编程可以应用于多种场景,如桌面应用程序、Web应用程序、便携设备应用程序、游戏开发、用户界面开发、富互联网开发等。通过安装一些插件,还可以在Linux等操作系统上运行.Net程序。

㈡ 如何正确理解.NET 4.5和C#5.0中的async/await异步编程模式

相对于之前Begin/End模式和事件模式,async/await模式让程序员得以用同步的代码结构进行异步编程。async/await入门很方便,但是深入理解却涉及很多领域,如线程池、同步上下文等等。我断断续续接触了几个月,稍微有一些心得:


await的作用是等待异步Task完成,并不是阻塞的。举个例子,一个异步方法:

publicasyncTaskCaller()
{
Action0();
awaitMethod();
Action3();
}

publicasyncTaskMethod()
{
Action1();
awaitTask.Delay(1000);
Action2();
}

A.当你在非UI线程A上执行Caller(),将完成以下几件事:

  1. [线程A]执行Action0()

  2. [线程A]调用await Method()

  3. [线程A]执行Action1()

  4. [线程A]启动任务Task.Delay(1000),并在线程池里安插一个新任务,在Task.Delay(1000)完成后,由另一个线程执行6

  5. [线程A]去处理别的事情

  6. [线程B]执行Action2()

  7. [线程B]await Method()返回

  8. [线程B]执行Action3()

其中,线程A和线程B并不保证是同一个线程。如果你在await前后打印线程ID,你会发现ID是不同的。


B.当你在UI线程上执行Caller(),过程有了变化:

  1. [UI线程]执行Action0()

  2. [UI线程]调用await Method()

  3. [UI线程]执行Action1()

  4. [UI线程]启动任务Task.Delay(1000),并在线程池里安插一个新任务,在Task.Delay(1000)完成后,由另一个线程执行6

  5. [UI线程]去处理别的事情

  6. [线程C]在UI线程的同步上下文中执行7(类似于在窗体类上执行Invoke()方法)

  7. [UI线程]执行Action2()

  8. [UI线程]await Method()返回

  9. [UI线程]执行Action3()

可见,当使用await方法的线程为UI线程时,程序默认会通过第6步,保证await前后是同一个线程ID。这个当然是有一定性能牺牲的(甚至会造成死锁,在D里会讨论),如果你不想在await完成后回到UI线程,见C。


C. 你可以在UI线程上使用await XXX().ConfigureAwait(false)去替代awaitXXX(),来禁止当await XXX()结束时恢复线程。举个例子,执行下列代码是没问题的(如B里描述的):

privateasyncvoidbutton1_Click(objectsender,EventArgse)
{
this.Text="123";
awaitTask.Delay(1000);
this.Text="321";
}

但是,执行下列代码就会发生“线程间操作无效”的错误:

privateasyncvoidbutton1_Click(objectsender,EventArgse)
{
this.Text="123";
awaitTask.Delay(1000).ConfitureAwait(false);
this.Text="321";//线程间操作无效
}

因为执行

this.Text="321";

的线程已经不再是UI线程。


D. 顺便一提,Task.Wait()方法,相比于await Task,会同步地执行Task。但是,如果你在UI线程上Wait的Task里本身又有await,那么将会产生死锁:

privatevoidFoo(objectsender,EventArgse)
{
this.Text="123";
Method().Wait();//此处发生死锁
this.Text="321";//这行永远也不会执行
}
privateasyncTaskMethod()
{
awaitTask.Delay(1000);
}

为什么呢?Method().Wait()会阻塞UI线程等待Method()完成,但是参照B过程,在await完成后,Method()完成前,是需要恢复到UI线程的,但是此时UI线程已经被阻塞了,因此死锁就发生了。

要避免这个死锁,可以参照C。


E. 说出来你可能不信,上面的都是我手打的。在内容上虽然不一定严谨,但希望对楼主和其它新接触TAP的朋友有一定启发。

热点内容
java捕捉异常 发布:2025-01-18 17:05:18 浏览:265
lob存储器 发布:2025-01-18 16:49:36 浏览:145
c语言统计字符串出现次数 发布:2025-01-18 16:47:56 浏览:930
androidpcmamr 发布:2025-01-18 16:45:02 浏览:775
南昊成绩查询的密码是多少 发布:2025-01-18 16:44:53 浏览:89
雷克萨斯nx哪个配置最保值 发布:2025-01-18 16:07:41 浏览:463
怎么改加密密码 发布:2025-01-18 16:06:48 浏览:126
通过域名访问内网 发布:2025-01-18 16:01:39 浏览:276
md5加密后的密码是什么意思 发布:2025-01-18 15:50:16 浏览:193
如何qq空间访问权限 发布:2025-01-18 15:49:30 浏览:532