私は、文書の単語を数えるWebアプリケーションを持っています。かなり長い時間がかかります。私はそれをページに分割し、別のスレッドの各ページのメソッドを呼び出しました。私はスレッドプールを使用していますasp.netタイマを使ったマルチスレッド
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「のエラーは、子要求の実行」が、それはまたのdidn私のために働いた。 この後、私のビジュアルスタジオはひっくり返り、このエラーが2回発生します "localhostはローカルWebサーバーに接続できません" エラー2回後にVisual Studioが正常に動作します。
更新
ここではそれをuユーザーEventWaitHandle becus誤りである私のタイマー宣言の
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();
}
どのようなタイマーを使用しますか? – Hinek
サイドノート:なぜハッシュテーブルですか? –
この作業は1回のリクエストで実行しますか?要求内で長時間実行されるタスクを実行できますが、ajaxコントロールを使用していない限り、(lbl1などの)コントロールを更新することはできません。 WebFormsまたはMVCを使用していますか? –