2

私は本当にこれでいくつかの助けを借りることができました-私は完全に立ち往生しています:-(

私が開発した検索コンポーネントに Async パターンを (正しく、できれば) 実装しました。これは Async ASP から呼び出されています。RegisterAsyncTask を使用したネット ページ。

コンポーネントが作業を完了すると、指定されたコールバックが呼び出され、AsyncState が値に設定された AsyncResult が渡されます。デバッガーは、コールバックが呼び出されたときに値が null でないことを確認します。

AsyncResult がページのメイン スレッドのコールバック関数へのパラメーターとして到着したとき - AsyncState プロパティは nullです。

これは、検索コンポーネントの関連セクションです。

    public virtual IAsyncResult BeginSearchAsync(
        Object sender, 
        EventArgs e,
        AsyncCallback cb, 
        object state)
    {
        _callback = cb;

        //... Some code

        // Start the asynchronous operation.
        WorkerEventHandler workerDelegate = new WorkerEventHandler(SearchWorker);
        return workerDelegate.BeginInvoke(
            paramz.terms,
            paramz.sourceName,
            asyncOp,
            cb,
            null);
    }

    protected void OnSearchCompleted(SearchCompleteEventArgs e)
    {
        if (_callback != null)
        {   
            //SearchAsyncResult implements IAsyncResult             
            SearchAsyncResult result = new SearchAsyncResult();
            result.IsCompleted = true;
            result.CompletedSynchronously = true;
            result.AsyncState = "TEST";
            //result.AsyncState = e;

            //at this point RESULT.ASYNCSTATE IS NEVER NULL!!!
            _callback(result);
        }            
    }

これは、呼び出しページの分離コードのコードです (このページには Async=true と AsyncTimeout 値が設定されています)。

    void searchSubmit_Click(object sender, EventArgs e)
    {

        foreach (RadPanelItem item in resultsPanelBar.GetAllItems())
        {

            //... Some Code 
            SearchEngine engine = new SearchEngine();
            var task = new PageAsyncTask(engine.BeginSearchAsync, EndSearch, null,                   srchParameters, true);

            RegisterAsyncTask(task);

        }
    }

    void EndSearch(IAsyncResult asyncResult)
    {

        if (asyncResult.AsyncState == null)
            return;
        //asyncResult.AsyncState: IS ALWAYS NULL!!!

        SearchCompleteEventArgs result 
            = (SearchCompleteEventArgs)asyncResult.AsyncState;

    }
4

1 に答える 1

2

簡単に言えば、私は徹底的に調査を行っていません。上記のコードには多くの問題があります。

最も重要な (これは今では明らかです) ことは、BeginSearchAsync メソッドから返された IAsyncResultObject をコンポーネントに保持する必要があることです。このオブジェクトは、操作中にコンポーネントによって更新されます。これらの変更は、操作を開始したスレッドによって監視されます。

コンポーネントが作業を終了したら、AsyncOperation を完了として設定し、必要な戻り値を同じオブジェクトに格納する必要があります。

IAsyncResult の実装は簡単ではありません。

これは、何が起こっているのかについての私の理解を明確にし、私のシナリオに適した AsyncResult クラスを取得するための具体的な実装を提供してくれた記事です。

http://msdn.microsoft.com/en-us/magazine/cc163467.aspx

于 2011-06-17T14:48:32.007 に答える