私は本当にこれでいくつかの助けを借りることができました-私は完全に立ち往生しています:-(
私が開発した検索コンポーネントに 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;
}