调用委托的不同方式之间的差异

时间:2010-10-08 03:51:52

标签: c# delegates

以下是什么区别?

public delegate void SetSthDelegate(int[] x);

// 1)
SetSthDelegate sst = new SetSthDelegate(SetSthMethod);
sst(x);

// 2)
Invoke(new SetSthDelegate(SetSthMethod), new object[] {x}

// 3)
BeginInvoke(new SetSthDelegate(SetSthMethod), new object[] {x}

我了解到2)用于同步调用方法,而3)用于异步调用方法,但是什么时候要同步和异步调用方法?

当插图和说明何时使用1),2),3)更合适时,有人能告诉我吗?

还可以解释为什么人们更喜欢Invoke而不是BeingInvoke,反之亦然?

3 个答案:

答案 0 :(得分:0)

数字1)和2)是相同的。他们同步调用委托。正如你所说,数字3)异步调用它。 如果您不想锁定线程并等到委托代码结束执行,则需要异步执行委托。通过使用beginInvoke,委托在后台线程中执行,并且主线程继续执行某些操作。

以下是详细说明:http://blogs.msdn.com/b/thottams/archive/2007/11/01/calling-delegates-using-begininvoke-invoke-dynamicinvoke-and-delegate.aspx

希望这有帮助!

答案 1 :(得分:0)

使用BeginInvoke的主要原因是操作需要时间。然后你可能不想阻止调用者,只是在完成后得到通知。它增加了代码的复杂性,所以如果你不需要它,你可能不想这样做。

如果操作很快,您可能不希望使用异步调用使代码复杂化。此外,如果此操作确实要求呼叫者等待答案,那么同步可能同样好。这一切都取决于......

答案 2 :(得分:0)

  • invoke类似于普通方法调用。
  • BeginInvoke()或asunc调用只是调用然后去。你不想等待工作完成,或者工作缓慢而且不需要等待 1)和2)是一回事。但是3)是异步调用

在我的应用程序中,当我想发送电子邮件或记录我使用BeginInvoke的东西因为它不是必要的等待