[英]Asynchronous programming design pattern
我正在為 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。 當然,除非您調用的代碼本身不支持異步操作。 就像讀/寫方法或服務調用一樣。
如果要通知異步操作已完成,請使用委托或事件回調。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.