Domanda

Potrei davvero fare un po 'di aiuto su questo - sono completamente bloccato :-(

Ho implementato il modello Async (correttamente, si spera) in un componente di ricerca che ho sviluppato. Questo viene chiamato da un aspdy asp. Pagina netta, utilizzando RegisterAsyncTask.

Quando il mio componente completa il suo lavoro, chiama il callback fornito, passando un asincresulto con l'asincstato impostato su un valore. Il debugger conferma che il valore non è nullo quando viene chiamato il callback.

Quando arriva l'asyncresult come parametro alla funzione di callback nel thread principale della pagina - La proprietà Asincstate è nulla.

Questa è le sezioni pertinenti del componente di ricerca:

    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);
        }            
    }

Questo è il codice dal codice CODEHIND della pagina di chiamata (questa pagina ha Async = true e un valore di valore 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;

    }
È stato utile?

Soluzione

La risposta breve è: non ho fatto a fondo le mie ricerche. Ci sono numerosi problemi con il codice sopra.

Il più significativo (che ora è ovvio per me), è che l'iasyncresultObject restituito dal metodo BeginSearchAsync deve essere mantenuto nel componente. Questo oggetto viene quindi aggiornato dal componente durante il suo funzionamento. Queste modifiche sono monitorate dal thread che ha avviato l'operazione.

Una volta che il componente ha terminato il suo lavoro, deve impostare l'asincoperazione come completata e archiviare qualsiasi valore di restituzione richiesto nello stesso oggetto.

L'implementazione di iasyncresult è oltre banale.

Questo è l'articolo che ha chiarito la mia comprensione di ciò che stava accadendo e mi ha dato un'implementazione concreta per iniziare per ottenere una classe Asyncresult adatta per il mio scenario:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top