0

AsyncResult オブジェクトのインスタンス化を検討していますが、インスタンス化できる .Net Frameowork のコンストラクターを持つ AsyncResult クラスがないようです。

誰かが C# で IAsynResult インターフェイスの実装をすぐに提供できますか? または、AsyncResult オブジェクトをインスタンス化するトリックの方法はありますか?

編集 1: ASP.Net ページ内で非同期タスクを作成しています。begin メソッドでは、「AsyncBeginGetSummary」というデータ レイヤーの静的メソッドを呼び出します。

私は通常、この静的メソッド内で ADO.Net BeginExecuteReader を使用します。これは完全に機能し、AsyncResult オブジェクトをインスタンス化する必要はありません。しかし、データ オブジェクトが ASP.Net アプリの Cache に存在する場合、''AsyncBeginGetSummary' のこの静的メソッドから、BeginExecuteReader を呼び出したくありません。

ただし、ASP.Net のタスクの End メソッドを呼び出せるように、AsyncResult オブジェクトを返す必要があります。私の 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: ダミーのメソッド デリゲートを使用して BeginInvoke を呼び出すため、AsyncResult オブジェクトのインスタンス化を気にする必要がない場合は、次のようになります。

 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結果がすでに利用可能であることを示す同期完了を示すが必要なようです。

その場合、trueforIsCompletedおよびを返す独自の単純なクラスを作成し、 およびforCompletedSynchronouslyで呼び出し元のパラメーターを返すことができます。AsyncStatenullWaitHandle

呼び出し元が を使用できるようにする場合はWaitHandle、 を作成してManualResetEvent、ある時点で破棄する必要があります。この記事を参照してください。

于 2012-12-30T02:43:47.753 に答える