0

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

1 回答 1

3

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

在这种情况下,您可以创建自己的简单类,该类返回trueforIsCompletedCompletedSynchronously,并返回调用者的参数 inAsyncStatenullfor WaitHandle

如果您希望调用者能够使用WaitHandle,您需要创建一个ManualResetEvent并在某个时候处理它;看到这篇文章

于 2012-12-30T02:43:47.753 回答