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