我希望实例化一个AsyncResult对象,但似乎没有AsyncResult类与.Net Frameowork中的构造函数,我可以实例化。
有人可以在C#中提供IAsynResult接口的现成实现吗?或者是否有一些技巧方法来实例化AsyncResult对象?
编辑1: 我在ASP.Net页面中创建一个异步任务。在begin方法中,我调用一个名为'AsyncBeginGetSummary'的数据层静态方法。
我通常会在这个静态方法中使用ADO.Net BeginExecuteReader,它可以完美地工作,我不需要实例化AsyncResult对象。但是,如果ASP中的数据对象存在于Cache中.Net app,然后从'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; }
}
}
答案 0 :(得分:3)
听起来你想要一个表示同步完成的IAsyncResult
- 结果已经可用。
在这种情况下,您可以创建自己的简单类,为true
和IsCompleted
返回CompletedSynchronously
,并在AsyncState
和{{1}中返回调用者的参数} null
。
如果您希望调用者能够使用WaitHandle
,您需要创建一个WaitHandle
并在某个时候处置它;见this article。