前往顾页
以后地位: 主页 > 收集编程 > .Net实例教程 >

C#中异步和多线程的辨别概述

时候:2013-04-10 20:54来源:知行网www.zhixing123.cn 编辑:麦田守望者

异步和多线程二者都可以到达避免调用线程梗阻的目标,从而进步软件的可呼应性,甚职苄些时候我们就以为异步和多线程是同等的观点,但是异步和多线程还是有一些辨别的,而这些辨别造成了利用异步和多线程的机会的辨别。

异步和多线程的辨别之异步操纵的本质

所有的法度终究都会由计较机硬件来履行,所以为了更好的了解异步操纵的本质,我们有需求体味一下它的硬件根本。 熟谙电脑硬件的朋友必定对DMA这个词不陌生,硬盘、光驱的技术规格中都有明白DMA的形式目标,其实网卡、声卡、显卡也是有DMA服从的。DMA就是直 接内存拜候的意义,也就是说,具有DMA服从的硬件在和内存进行数据互换的时候可以不耗损CPU资本。只需CPU在建议数据传输时发送一个指令,硬件就开 始本身和内存互换数据,在传输完成以后硬件会触发一个间断来告诉操纵完成。这些不必耗损CPU时候的I/O操纵恰是异步操纵的硬件根本。所以即便在DOS 如许的单过程(并且无线程观点)体系中也一样可以建议异步的DMA操纵。

异步和多线程的辨别之线程的本质

线程不是一个计较机硬件的服从,而是操纵体系供应的一种逻辑服从,线程本质上是过程中一段并发运行的代码,所以线程需求操纵体系投入CPU资本来运行和调剂。

异步和多线程的辨别之异步操纵的优错误谬误

因为异步操纵不必分外的线程负担,并且利用回调的体例进行措置,在设想杰出的环境下,措置函数可以没必要利用共享变量(即便无法完整不消,最起码可以减少 共享变量的数量),减少了死锁的可能。当然异步操纵也并不是完美得空。编写异步操纵的复杂程度较高,法度首要利用回调体例进行措置,与浅显人的思惟体例有些出入,并且难以调试。

异步和多线程的辨别之多线程的优错误谬误

多线程的长处很较着,线程中的措置法度仍然是依次履行,适合浅显人的思惟习惯,所以编程简朴。但是多线程的错误谬误也一样较着,线程的利用(滥用)会给体系带来上下文切换的分外负担。并且线程间的共享变量可能造成死锁的呈现。

合用范围

当需求履行I/O操纵时,利用异步操纵比利用线程+同步 I/O操纵更适合。I/O操纵不但包含了直接的文件、收集的读写,还包含数据库操纵、Web Service、HttpRequest和.net Remoting等跨过程的调用。

而线程的合用范围则是那种需求长时候CPU运算的场合,比方耗时较长的图形措置和算法履行。但是因为利用线程编程的简朴和适合习惯,很多人会利用线程来履行耗时较长的I/O操纵。如许在只需多数几个并发操纵的时候还无伤年夜雅,如果需求措置年夜量的并发操纵时就不适合了。

异步和多线程的辨别实例研究

异步和多线程的辨别实例:由delegate产生的异步体例究竟是怎样回事?

利用delegate可以“主动”使一个别例进行异步的调用,是由编译器或CLR利用了别的的线程来履行目标体例,见实例代码:

using System;
using System.Threading;
namespace AsyncDelegateDemo
{
delegate void AsyncFoo(int i);
class Program
{
/// ﹤summary﹥
/// 输入当火线程的信息
/// ﹤/summary﹥
/// ﹤param name="name"﹥体例称呼﹤/param﹥
static void PrintCurrThreadInfo(string name)
{
Console.WriteLine("Thread Id of " + name + " is: " + Thread.CurrentThread.ManagedThreadId + ", current thread is "
+ (Thread.CurrentThread.IsThreadPoolThread ? "" : "not ") + "thread pool thread.");
}

/// ﹤summary﹥
/// 测试体例,Sleep一定时候
/// ﹤/summary﹥
/// ﹤param name="i"﹥Sleep的时候﹤/param﹥
static void Foo(int i)
{
PrintCurrThreadInfo("Foo()");
Thread.Sleep(i);
}

/// ﹤summary﹥
/// 送达一个异法度用
/// ﹤/summary﹥
static void PostAsync()
{
AsyncFoo caller = new AsyncFoo(Foo);
caller.BeginInvoke(1000, new AsyncCallback(FooCallBack), caller);
}

static void Main(string[] args)
{
PrintCurrThreadInfo("Main()");
for (int i = 0; i < 100; i++)
{
PostAsync();
}
Console.ReadLine();
}

static void FooCallBack(IAsyncResult ar)
{
PrintCurrThreadInfo("FooCallBack()");
AsyncFoo caller = (AsyncFoo)ar.AsyncState;
caller.EndInvoke(ar);
}
}
}

异步和多线程的辨别实例代码的输入以下:

Thread Id of Main() is: 1,

current thread is not thread pool thread.

 

Thread Id of Foo() is: 3,

current thread is thread pool thread.

 

Thread Id of FooCallBack() is: 3,

current thread is thread pool thread.

 

Thread Id of Foo() is: 3,

current thread is thread pool thread.

 

Thread Id of Foo() is: 4,

current thread is thread pool thread.

 

Thread Id of Foo() is: 5,

current thread is thread pool thread.

 

Thread Id of FooCallBack() is: 3,

current thread is thread pool thread.

 

Thread Id of Foo() is: 3,

顶一下
(0)
0%
踩一下
(0)
0%
------分开线----------------------------
标签(Tag):C# C#实例教程 c#根本教程 C#源代码 c#技能
------分开线----------------------------
颁发评论
请自发遵循互联网相关的政策法规,严禁公布色情、暴力、革命的谈吐。
评价:
神色:
考证码:点击我更换图片
猜你感兴趣