那位前辈能说说Delegate的Invoke和BeginInvoke区别?
还有,下面的代码的委托,没有另外创建新线程来执行吧? delegate double MathsOp( double x );
class Start
{
public class MyDelegate
{
public static double MultiplyBy2( double x )
{
return x * 2;
}
}
[STAThread]
static void Main(string[] args)
{
MathsOp operation = new MathsOp( MyDelegate.MultiplyBy2 );
double x = 1.23;
double result = operation( x );
Console.WriteLine( "{0} * 2 = {1}", x, result );
Console.Read();
}
}
还有,下面的代码的委托,没有另外创建新线程来执行吧? delegate double MathsOp( double x );
class Start
{
public class MyDelegate
{
public static double MultiplyBy2( double x )
{
return x * 2;
}
}
[STAThread]
static void Main(string[] args)
{
MathsOp operation = new MathsOp( MyDelegate.MultiplyBy2 );
double x = 1.23;
double result = operation( x );
Console.WriteLine( "{0} * 2 = {1}", x, result );
Console.Read();
}
}
我们要基于以下认识:
(1)Control的Invoke和BeginInvoke与Delegate的Invoke和BeginInvoke是不同的。
(2)Control的Invoke和BeginInvoke的参数为delegate,委托的方法是在Control的线程上执行的,也就是我们平时所说的UI线程。
Delegate的BeginInvoke是在新的线程执行的,Control.BeginInvoke是在创建Control的线程里执行的
简单来说,Invoke就是直接运行,BeginInvoke是开启另一个辅助线程运行。你的那个例子就是直接运行的例子,和调用Invoke没有多大区别,唯一的不同是,调用Invoke是利用反射在执行,效率上稍比你例子中的直接运行差,不过两者都没有另外创建新线程来执行。
只是它會先排到該thread queue著等待,等到該ui thread有空時才換它執行。簡單地說,就像學校的打掃工作,假如你是負責打掃廁所的唯一人選(thread),
Control的BeginInvoke()就相當於同學們(controls)如何排隊上廁所
不管他們怎麼排隊(立刻上或照座號上),最後執行清理的人還是你
絕對不是他們拉的人掃,這樣通俗的講法不知是否較清楚呢?至於一般delegate的BeginInvoke(),只是講如何排隊執行,
並沒有談到要做啥內容,因此就較符合異步執行(不同thread)的方式。
不会吧大哥,你等级这样高了,怎么会没有见过。难道你是抠字眼了。 他问的是delegate不是DelegateDelegate是没有的。delegate的实例是有的。