我已经搜索了几天,并尝试了我能找到的所有解决方案。我知道这是我做的不对,但是,我不确定正确的方法是什么。
我有一个 ASP.Net C# 网站,在 .Net Framework 4.5 上运行。我在表单上有一个链接按钮,单击该按钮会触发使用 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,我确定代码未触发的原因是因为我试图在回调事件中触发的 ScriptManager 代码位于主线程之外的不同线程上。
这是我的问题......
(1)我为什么不触发 JavaScript 是否正确(2)我如何(从回调内部)让这个 JavaScript 触发?有没有办法强制它在主线程上执行?