带有C#构造函数的AsyncResult类

时间:2012-12-30 02:06:51

标签: c# asp.net iasyncresult

我希望实例化一个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; }
    }
}

1 个答案:

答案 0 :(得分:3)

听起来你想要一个表示同步完成的IAsyncResult - 结果已经可用。

在这种情况下,您可以创建自己的简单类,为trueIsCompleted返回CompletedSynchronously,并在AsyncState和{{1}中返回调用者的参数} null

如果您希望调用者能够使用WaitHandle,您需要创建一个WaitHandle并在某个时候处置它;见this article