在C#中使用委托/BeginInvoke将调用者与被调用者分离

在C#中使用委托/BeginInvoke将调用者与被调用者分离,c#,multithreading,delegates,begininvoke,C#,Multithreading,Delegates,Begininvoke,在C#中,我有一个类的层次结构,这些类执行的操作可能需要很长时间。出于这个原因,我实现了一个解耦/回调机制,这样调用方就不会被阻止,而是通过回调接口被告知操作已经完成。这看起来像这样: protected delegate void ActionDelegate(); public void doAction() { Task.Factory.StartNew(() => DoActionASync()); } private void DoActionASync() { DoAc

在C#中,我有一个类的层次结构,这些类执行的操作可能需要很长时间。出于这个原因,我实现了一个解耦/回调机制,这样调用方就不会被阻止,而是通过回调接口被告知操作已经完成。这看起来像这样:

protected delegate void ActionDelegate();
public void doAction()
{
  Task.Factory.StartNew(() => DoActionASync());
}
private void DoActionASync()
{
  DoActionImpl(); 
  Caller->ActionDone(); // Caller is registered separately, and implements an interface (ICallback) that includes this function
}
protected abstract void DoActionImpl(); // Derived classes implement this

这是大量重复的代码,每个方法都有细微的差异(签名)。我的问题是,这是否是解决这个问题的正确方法,或者.NET/C是否提供了任何可以简化/减少冗长的结构?

有很好的相关文档。如果您使用的是.NET4,那么您应该查看(TPL)


介绍了使用委托进行异步编程(还有一个额外的部分)。如果遵循MSDN的实践和建议,您可能会做得更糟。

调用者和被调用者是否处于不同的线程中?不编写此代码是有道理的。您缺少必需的EndInvoke()调用。帮助类是.NET4中的Task和BackgroundWorker。@Hans:这是一个很好的信息。任务类确实是启动新线程的更好方法。谢谢我以为微软的官方立场是TPL还没有准备好生产代码?@Ramhound:如果它还没有准备好生产,我认为微软(或其他任何人)不会将其作为新框架版本的主要功能之一加以推广。你可能弄错了。