簡體   English   中英

帶計時器的asp.net多線程

[英]asp.net Multithreading with timer

我有一個可以計算文檔字數的Web應用程序。 所以要花很長時間。我已將其分為多個頁面,並在不同線程中為每個頁面調用了方法。 我正在使用線程池

        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,但它對我也不起作用。 畢竟,我的Visual Studio卡住了,並且在錯誤兩次Visual Studio工作正常之后,我兩次出現此錯誤“本地主機無法連接到本地Web服務器”。

更新資料
這是我的計時器聲明的

     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();           
    }

由於用戶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頁面中使用計時器控制來觸發客戶端調用

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM