Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
脑筋急转弯:AsyncResult AsyncState在异步ASP.Net页面中回调后为空_Asp.net_Multithreading_Asynchronous_Iasyncresult_Asynchronous Pages - Fatal编程技术网

脑筋急转弯:AsyncResult AsyncState在异步ASP.Net页面中回调后为空

脑筋急转弯:AsyncResult AsyncState在异步ASP.Net页面中回调后为空,asp.net,multithreading,asynchronous,iasyncresult,asynchronous-pages,Asp.net,Multithreading,Asynchronous,Iasyncresult,Asynchronous Pages,在这一点上我真的需要一些帮助-我完全被卡住了:-( 我已经在我开发的搜索组件中实现了异步模式(希望是正确的)。这是从异步Asp.Net页面使用RegisterAsyncTask调用的 当我的组件完成其工作时,它将调用提供的回调,并将设置了AsyncState的AsyncResult传递给一个值。调试器确认调用回调时该值不为null。 当AsyncResult作为页面主线程上回调函数的参数到达时-AsyncState属性为null 这是搜索组件的相关部分: public virtual I

在这一点上我真的需要一些帮助-我完全被卡住了:-(

我已经在我开发的搜索组件中实现了异步模式(希望是正确的)。这是从异步Asp.Net页面使用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);
        }            
    }
这是调用页的codebehind中的代码(此页设置了Async=true和AsyncTimeout值):


简单的回答是-我没有做彻底的研究。上面的代码有很多问题

最重要的一点(现在对我来说很明显)是,从BeginSearchSync方法返回的IAsyncResultObject必须保留在组件中。该对象随后由组件在其操作过程中更新。这些更改由启动该操作的线程监视

组件完成工作后,必须将AsyncOperation设置为completed,并在同一对象中存储所需的任何返回值

IAsyncResult的实现绝非易事

这篇文章澄清了我对正在发生的事情的理解,并给了我一个具体的实现,让我从中开始,为我的场景获得一个合适的AsyncResult类:


在调用的方法中,在我的页面中,接收到的IAsyncResult类型为System.Runtime.Remoting.Messaging.AsyncResult。因此,我在自定义AsyncResult类上设置的返回值在该类上不可用。。。
    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;

    }