2011-12-07 18 views
0

スレッド方式でInt32.Parse(Request.QueryString["PLCID"].ToString())の値を取得しようとしたとき、私はエラーを得て、私はparameterizedthreadを使用しようとしましたが、私のコードスニペットASP.NET:スレッドメソッドでQueryStringの値を取得する方法は?

protected void btnReqConfirm_Click(object sender, EventArgs e) 
{ 
    Int32 val = Int32.Parse(Request.QueryString["PLCID"].ToString()); 
    id = Guid.NewGuid(); 

    ThreadStart ts = new ThreadStart(longRunningProcess); 
    Thread th = new Thread(ts); 
    th.Start(); 

    Response.Redirect("Status.aspx?ID="+id.ToString()); 
} 
protected void longRunningProcess() 
{ 
    String _MachineName = String.Empty; 
    _MachineIP = String.Empty; 
    DBLayer.getMachineByPLCID(Int32.Parse(Request.QueryString["PLCID"].ToString()), out _MachineName, out _MachineIP); 

    if (DBLayer.insertRequest(User.Identity.Name, DBLayer.getMachineID(_MachineName), Convert.ToDateTime(lblReqFromVal.Text), Convert.ToDateTime(lblReqToVal.Text))) 
    { 
     _PLCName = DBLayer._getPlCByID(Int32.Parse(Request.QueryString["PLCID"].ToString())); 

     //stop mail now 
     LogicLayer.AddNewListItem("Confirmation Mail", "You can initiate your session directly from this link : " + string.Format(@"http://IP/RRRProject/DirectSessionPage.aspx?Machine={0}", _MachineIP), (User.Identity.Name).Substring(5) + "@invensys.com"); 
     lblConfirmationMessage.Visible = true; 
     lblConfirmationMessage.ForeColor = Color.Green; 

     Thread.Sleep(9000); 
     SimpleProcessCollections.Add(id, "Some result."); 
    } 
} 

任意のアイデアここ

をfaild?

+0

あなたが話しているこのエラーの詳細を掲載していますか?また、従来のアプリケーションと同様に、asp.netによるマルチスレッドは機能しません。メインスレッドが既に 'Request.Response()'を行った後で、サイドスレッドがコントロールを更新することはできません。 (多分あなたはAJAXを見たいと思っていますか?) –

+0

あなたは私の解決策を試しましたか? –

答えて

1

新しいスレッドは、最初のものと同じHttpContextに結び付けられていないと仮定します。 Request.QueryStringコールはHttpContext.Current.Request.QueryStringへの呼び出しなので、Webアプリケーションのパラメータは表示されません。

とにかく、QueryStringをスレッドに渡して使用することができます。コードサンプルを見てください。

protected void btnReqConfirm_Click(object sender, EventArgs e) 
{ 
... 
    ThreadStart ts = new ThreadStart(longRunningProcess(Request.QueryString)); 
... 
} 

protected void longRunningProcess(NameValueCollection queryString) 
{ 
... 

    _PLCName = DBLayer._getPlCByID(Int32.Parse(queryString["PLCID"].ToString())); 
... 
} 
0

クエリーストリングまたは必要な値のオブジェクトを関数に渡すだけの理由はありますか?

関連する問題