2009-01-21 53 views
4

我需要什么代表和线程?C#代表和线程!

+0

功课?这是一个非常基本的问题 – johnc 2009-01-21 23:13:11

+4

即使它可能是基本的,它仍然是一个合法的问题。 – 2009-01-21 23:48:56

回答

11

代表充当逻辑(但安全),相当于函数指针;他们允许您以抽象的方式谈论操作。这个典型的例子是事件,但我会用更多的“函数编程”的例子:在列表中搜索:

List<Person> people = ... 
Person fred = people.Find(x => x.Name == "Fred"); 
Console.WriteLine(fred.Id); 

的“拉姆达”在这里本质上是一种委托的实例 - 一个委托类型Predicate<Person> - 即“给予一个人,是真实的还是错误的”。使用代表允许非常灵活的代码 - 即List<T>.Find方法可以根据呼叫者通过的委托来找到各种事情。

以这种方式,它们在很大程度上的作用类似于1方法接口 - 但更为简洁。

2

代表用于动态地向事件添加方法。

线程在进程内运行,并允许您一次运行共享资源的2个或更多任务。

+0

代表们做的比这多很多...... – 2009-01-21 23:15:48

7

Delegates:基本上,委托是引用方法的一种方法。它就像一个指向方法的指针,您可以将它设置为与其签名匹配的不同方法,并使用它将引用传递给该方法。

Thread是一个接一个地执行完成计算的指令序列流。您可以同时运行不同的线程来完成特定的任务。线程在单个逻辑处理器上运行。

1

具体的例子总是帮助我,所以这里是一个线程。考虑你的网络服务器。当请求到达服务器时,它们被发送到Web服务器进程进行处理。它可能会处理每个到达,完全处理请求和生成页面之前,转向下一个。但是请考虑在硬盘驱动器速度(而不是CPU速度)下进行多少处理,因为在完成响应之前请求的页面从磁盘中提取(或从数据库中提取数据)。

通过从线程池中提取线程并为每个请求提供自己的线程,我们可以在磁盘返回第一个数据之前处理数百个请求的非磁盘需求。这将允许一定程度的虚拟并行性,可以显着提高性能。请记住,Web Server的性能还有很多,但这应该给你一个关于线程如何有用的具体模型。

0

你的问题是含糊不清......

但你可能只是想知道如何使用它们,以便有一个窗口,一个耗时的过程运行和进度条...

因此,创建一个线程来完成耗时的过程,并使用委托来增加进度条! :)

1

它们用于高级语言有用的相同原因。你不需要他们做任何事情,因为他们真的只是对真正发生的事情的抽象。他们的确让事情变得更容易,更快速地编程或理解。

1

Marc Gravell为'代表什么是代表'提供了一个很好的答案。

安德鲁·特罗尔森定义了一个线程作为

...的过程中的执行路径。 “Pro C#2008和.NET 3.5平台”,Aress。

在您的系统上运行的所有进程都至少有一个线程。我们称之为主线程。您可以根据各种原因创建其他线程,但是说明线程目的的最明显的例子是打印。假设你打开你最喜欢的文字处理应用程序(WPA),输入几行,然后打印这些行。如果您的WPA使用主线程来打印文档,WPA的用户界面将被“冻结”,直到打印完成。这是因为主线程必须打印的线条,才可以处理任何用户界面事件,即按钮点击,鼠标移动等,这是因为如果代码是这样写的:

do 
    { 
     ProcessUserInterfaceEvents(); 
     PrintDocument(); 
    } while (true); 

显然,这不是用户想要的。用户希望用户界面在文档正在打印时具有响应性。

答案当然是在第二个线程中打印行。通过这种方式,用户界面可以专注于处理用户界面事件,而辅助线程专注于打印线条。

错觉是两项任务同时发生。在单处理器机器上,这不可能是真实的,因为处理器一次只能执行一个线程。但是,线程之间的切换发生得如此之快以至于通常会保持错觉。在多处理器(或多核)机器上,这可能是字面上真实的,因为主线程可以在一个处理器上运行,而辅助线程在另一个处理器上运行。

在.NET中,线程是一件轻而易举的事情。您可以使用System.Threading.ThreadPool类,使用异步委托或创建自己的System.Threading.Thread对象。

如果你是新来的线程,我会抛出两个警告。

首先,如果您选择错误的线程模型,实际上可能会损害应用程序的性能。要小心避免使用太多的线程或试图线索那些应该真正发生的事情。

二(更重要的),要知道,如果你线程之间共享数据,你可能会需要sychronize访问共享数据,例如,使用C#lock关键字。有丰富的关于这一主题在网上提供的信息,所以我就不在这里重复了。要知道,你可以遇到间歇性的,并不-总是重复的错误,如果你不这样做仔细。