异步编程设计模式

我正在研究CF.NET的一个小技术框架,我的问题是,我应该如何编写异步部分? 阅读MSDN上的很多内容,但对我来说并不清楚。

所以,这是代码:

public class A { public IAsyncResult BeginExecute(AsyncCallback callback) { // What should I put here ? } public void EndExecute() { // What should I put here ? } public void Execute() { Thread.Sleep(1000 * 10); } } 

如果有人可以帮助我……

谢谢 !

您可以使用委托:

 public class A { public void Execute() { Thread.Sleep(1000 * 3); } } class Program { static void Main() { var a = new A(); Action del = (() => a.Execute()); var result = del.BeginInvoke(state => { ((Action)state.AsyncState).EndInvoke(state); Console.WriteLine("finished"); }, del); Console.ReadLine(); } } 

更新:

根据评论部分的要求,这是一个示例实现:

 public class A { private Action _delegate; private AutoResetEvent _asyncActiveEvent; public IAsyncResult BeginExecute(AsyncCallback callback, object state) { _delegate = () => Execute(); if (_asyncActiveEvent == null) { bool flag = false; try { Monitor.Enter(this, ref flag); if (_asyncActiveEvent == null) { _asyncActiveEvent = new AutoResetEvent(true); } } finally { if (flag) { Monitor.Exit(this); } } } _asyncActiveEvent.WaitOne(); return _delegate.BeginInvoke(callback, state); } public void EndExecute(IAsyncResult result) { try { _delegate.EndInvoke(result); } finally { _delegate = null; _asyncActiveEvent.Set(); } } private void Execute() { Thread.Sleep(1000 * 3); } } class Program { static void Main() { A a = new A(); a.BeginExecute(state => { Console.WriteLine("finished"); ((A)state.AsyncState).EndExecute(state); }, a); Console.ReadLine(); } } 

你不需要做任何特殊的事情,因为调用者应该叫你方法异步,

他定义了一个指向你方法的新委托,并使用.net异步调用你的方法。

在BeginExecute上,您必须启动异步操作(可能在单独的线程中启动执行)并尽快返回。 Execute必须在所有操作结束时调用AsyncCallback,以便使用异步操作的人知道并获得结果。 EndExecute必须停止先前启动的异步操作(可能会中断BeginExecute启动的线程)。
没有更多细节,这是我能做的最好的事情。

如果要异步运行一段代码,则应使用BackgroundWorker。 当然,除非您调用的代码本身不支持异步操作。 就像读/写方法或服务调用一样。

如果要通知异步操作已完成,请使用委托或事件回调。