我有一个计算文档单词的Web应用程序。所以需要很长时间。我已经将它分成了不同线程中每个页面的页面和调用方法。我使用threadpool作为
ThreadPool.SetMaxThreads(25, 200);
State state;
Hashtable ht = new Hashtable();
for (int i = 0; i < 100; i++)
{
state = new State();
state.Input = "Pakistan";
ThreadPool.QueueUserWorkItem(PerformUserWorkItem, state);
ht.Add(i, state);
}
State tempState;
for (int i = 0; i < 100; i++)
{
tempState = (State)ht[i];
if (tempState.eventWaitHandle.WaitOne())
{
Session["percentage"] = i;
lblPercentage.Text = (i * 1).ToString();
}
}
private static void PerformUserWorkItem(Object stateObject)
{
State state = stateObject as State;
if (state != null)
{
// do something lengthy with state.inputString
state.result = state.Input.Length;
state.eventWaitHandle.Set(); // signal we're done
}
}
在上面的代码中,我已将线程排队等待工作并将其初始状态保存在哈希表中。 我有计时器,更新页面上的进度条,计算完了多少页计数和剩余多少。
我需要将我的页面重定向到另一个页面,我得到的错误是响应在此上下文中不可用。我试图使用server.transfer,但错误为
“执行子请求时出错” 然后我已经禁用了目标页面(我正在重定向)属性enabeviewstate = false但它也没有为我工作。 毕竟这个我的视觉工作室被卡住了,我得到了两次这个错误 “localhost无法连接到本地Web服务器” 错误2次后我的视觉工作室工作正常。
更新
这是我的计时器声明
System.Timers.Timer t = new System.Timers.Timer(3000);
t.Enabled = true;
t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
lbl1.Text = DateTime.Now.ToString();
}
答案 0 :(得分:0)
用户EventWaitHandle是错误的。 wait handle使你的主线程(客户端线程)仍然活着。在使用Server.Transfer之后,它将具有ThreadAbourtException,因为主线程正在工作并与子线程协作。
我推荐.Net 4.0
public void perform()
{
Object[] works = ...;
System.Threading.Tasks.Parallel.ForEach(works, each => { PerformUserWorkItem(each); });
Server.Transfer("progress.aspx");
}
private static void PerformUserWorkItem(Object stateObject)
{
...
}
在progress.aspx页面中,你可以使用名为'setTimer()'的javascript函数来调用以获得进展。
此外,System.Timers.Timer是一个在服务器上运行的计时器对象,它无法控制远程环境。如果你想要asp页面回调,你需要在asp页面中进行定时器控制来触发客户端调用