私は今数日検索し、見つけたすべての解決策について試しました。私はこれが私が正しくやっていないことであることを知っています、しかし、私は正しい方法が何であるかわかりません。
.Net Framework4.5で実行されているASP.NetC#Webサイトがあります。フォームにリンクボタンがあります。クリックすると、ThreadPoolを使用して長時間実行されているプロセスが起動します。デリゲートコールバックを設定していますが、プロセスがキャンセルされたとき、またはプロセスが終了したときにコードが起動します。(私はプロセスをキャンセルするためにキャンセルトークンを使用しています。重要な場合、プロセスはアクティブレポートです。)
私が言ったように、コールバックコードが起動したときにjavascriptを実行しないことを除いて、すべてがうまく機能します。(参考までに、これはjavascriptコールバックではなく、プロセスの終了時にいくつかのjavascriptコードを起動しようとしているだけです。)
これが私がレポートを開始するコードです...
文字列sThreadID=Thread.CurrentThread.ManagedThreadId.ToString(); ThreadPool.QueueUserWorkItem(new WaitCallback(StartReport)、cts.Token);
StartReportのコードは次のとおりです。
public static void StartReport(object obj) {
try {
OnTaskCompleteDelegate callback = new OnTaskCompleteDelegate(OnTaskComplete);
BoyceReporting.CallReport(boyce.BoyceThreadingEnvironment.OBRO, "THREADING");
if (boyce.BoyceThreadingEnvironment.CTS.Token.IsCancellationRequested) {
boyce.BoyceThreadingEnvironment.SESSION.sScriptToExecute = "alert('Report Canceled By User');";
callback("CANCELED");
} else {
callback("FINISHED");
}
} catch {
throw;
}
}
これがコールバックコードのコードです.....
public static void OnTaskComplete(string ReportResult) {
try {
sReportResult = ReportResult;
if (ReportResult == "CANCELED") {
// In case we need to do additional things if the report is canceled
}
string sThreadID = Thread.CurrentThread.ManagedThreadId.ToString();
boyce.BoyceThreadingEnvironment.THISPAGE.ClientScript.RegisterStartupScript(boyce.BoyceThreadingEnvironment.THISPAGE.GetType(), "FireTheScript" + DateTime.Now.ToString(), boyce.BoyceThreadingEnvironment.SESSION.sScriptToExecute, true);
ScriptManager.RegisterStartupScript(boyce.BoyceThreadingEnvironment.THISPAGE, boyce.BoyceThreadingEnvironment.THISPAGE.GetType(), "DisplayReport" + DateTime.Now.ToString(), boyce.BoyceThreadingEnvironment.SESSION.sScriptToExecute, true);
} catch {
throw;
}
}
これが私が抱えている問題です.....
スクリプトを起動するコードの最後の行を取得できないことを除いて、すべてが正常に機能します。ScriptManager.RegisterStartupScript
これが私が起こっていると思うことです.....
スレッドIDを見ると、コードが起動されない理由は、Call Backイベントで起動しようとしているScriptManagerコードが、メインスレッド以外の別のスレッドにあるためだと確信しています。
これが私の質問です。
(1)これがJavaScriptを起動しない理由は正しいですか?(2)(CallBackの内部から)このJavaScriptを起動するにはどうすればよいですか?これをメインスレッドで強制的に実行する方法はありますか?