【问题标题】:asp.net Multithreading with timer带计时器的asp.net多线程
【发布时间】:2010-12-07 09:42:42
【问题描述】:

我有一个计算文档字数的网络应用程序。所以它需要很长时间。我已将其划分为页面并为不同线程中的每个页面调用方法。我正在使用线程池作为

        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 但它也对我不起作用。 毕竟我的视觉工作室被卡住了,我两次收到这个错误 “本地主机无法连接到本地 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();           
    }

【问题讨论】:

  • 你用什么定时器?
  • 您是否在单个请求中执行此工作?您可以在请求中执行长时间运行的任务,但不能更新控件(如您的lbl1),除非您使用的是 ajax 控件。你使用 WebForms 还是 MVC?

标签: c# asp.net multithreading timer


【解决方案1】:

这是错误因为你的用户 EventWaitHandle。等待句柄使您的主线程(客户端线程)仍然存在。在你使用 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页面中控制定时器来触发客户端调用

【讨论】:

    猜你喜欢
    • 2017-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多