我希望实例化一个 AsyncResult 对象,但在.Net Frameowork 中似乎没有可以实例化的带有构造函数的 AsyncResult 类。
有人可以在 C# 中提供 IAsynResult 接口的现成实现吗?还是有一些技巧方法来实例化 AsyncResult 对象?
编辑 1: 我正在 ASP.Net 页面中创建一个异步任务。在开始方法中,我调用了一个名为“AsyncBeginGetSummary”的数据层静态方法。
我通常会在此静态方法中使用 ADO.Net BeginExecuteReader,它可以完美运行,并且我不需要实例化 AsyncResult 对象。但是,如果数据对象存在于 ASP.Net 应用程序的缓存中,那么从“AsyncBeginGetSummary”的这个静态方法中,我不想调用 BeginExecuteReader。
但是,我仍然需要返回 AsyncResult 对象,以便可以调用 ASP.Net 中任务的 End 方法。我的 ASP.Net 页面代码如下所示。
IAsyncResult BeginAsyncOperation1(object sender, EventArgs e, AsyncCallback cb,
object state)
{
//call a static method from DAL that returns IAsyncResult.
//call 'AsyncBeginGetSummary' static method in DAL
}
void EndAsyncOperation1(IAsyncResult ar)
{
//call a static method in DAL that gets your data here
//call 'AsyncEndGetSummary' static method in DAL
}
编辑 2: 我有以下内容,我不需要为实例化 AsyncResult 对象而烦恼,因为我使用虚拟方法委托来调用 BeginInvoke。
IAsyncResult BeginAsyncOperation1(object sender, EventArgs e, AsyncCallback cb, object state)
{
//call a static method from DAL that return IAsyncResult.
if((Cache["abc"] !=null)
{
return (new dummy(DummyMethod)).BeginInvoke(cb, new FinalDataForDocumentsSummary(listFromCache.Count, listFromCache));
}
return NFM.Data.Mappers.DocumentsSummaryByProgramDataMapper.AsyncBeginEndDocumentsSummaryByProgramAll( vendorId, cb);
}
void EndAsyncOperation1(IAsyncResult ar)
{
//call a static method in DAL that gets your data here
}
public delegate void dummy();
private void DummyMethod()
{
}
编辑 3:我在 WCF 中使用了以下 AsyncResult 实现。我想我也可以在 ASP.Net 中使用它。
class AsyncResult<T> : IAsyncResult
{
private T data;
private object state;
private bool isCompleted = false;
private AutoResetEvent waitHandle;
private bool isSynchronous = false;
public T Data
{
set { data = value; }
get { return data; }
}
public AsyncResult(bool synchronous, object stateData)
{
isSynchronous = synchronous;
state = stateData;
}
public void Complete()
{
isCompleted = true;
((AutoResetEvent)AsyncWaitHandle).Set();
}
public object AsyncState
{
get { return state; }
}
public WaitHandle AsyncWaitHandle
{
get
{
if (waitHandle == null)
waitHandle = new AutoResetEvent(false);
return waitHandle;
}
}
public bool CompletedSynchronously
{
get
{
if (!isCompleted)
return false;
else
return isSynchronous;
}
}
public bool IsCompleted
{
get { return isCompleted; }
}
}