【问题标题】:asp.net textbox not updated from another taskasp.net 文本框未从另一个任务更新
【发布时间】:2013-05-30 08:23:03
【问题描述】:

我有一个GridView 并在其SelectedIndexChanged 上触发了代码:

protected void grdEntry_SelectedIndexChanged(object sender, EventArgs e)
{
    lblAssignId.Text = grdEntry.SelectedRow.Cells[1].Text == " " 
                       ? ""
                       : grdEntry.SelectedRow.Cells[1].Text;
    Ob.BranchId = Globals.BranchID;
    Ob.AssignId = lblAssignId.Text;
    DataSet dsMain = GetAssignDetails(Ob);
    if (dsMain.Tables[0].Rows.Count != 0)
    {
        // some other code
        Task.Factory.StartNew(() => FillMemberShipAndBarCode(dsMain.Tables[0].Rows[0]["CustomerCode"].ToString(), Ob.BranchId));
    }
}

而填写会员ID的代码是

private void FillMemberShipAndBarCode(string customerCode, string branchId)
{
    var sqlCommand = new SqlCommand
    {
        CommandText = "sp_customermaster",
        CommandType = CommandType.StoredProcedure
    };
    sqlCommand.Parameters.AddWithValue("@CustomerCode", customerCode);
    sqlCommand.Parameters.AddWithValue("@BranchId", branchId);
    sqlCommand.Parameters.AddWithValue("@Flag", 18);
    var data = PrjClass.GetData(sqlCommand);
    txtMemberShip.Text = data.Tables[0].Rows[0]["MembershipId"].ToString();
    txtBarCode.Text = data.Tables[0].Rows[0]["Barcode"].ToString();    
}

它工作正常,但没有更新任何文本框。另外,我在监视窗口中检查,值按预期返回(M-1213634-98-4)并且代码确实到达了点 txtMemberShip.Text = data.Tables[0].Rows[0]["MembershipId"].ToString(); 但是txtMemberShip 仍然是空的???谁能告诉我为什么不更新文本框?

更新

根据 cmets,这里是页面加载

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        BindDropDown();
        BindGrid();
        SetDefaultsInTextBoxes();
    }
}

而且我没有任何代码等待这个任务。

【问题讨论】:

  • 告诉我你的page_load,你在page_load中使用page.ispostback
  • 您是否有代码在执行渲染之前等待这些任务完成?
  • @Rahul:更新了问题。
  • 确定GetData 方法的返回类型是什么,并检查var data 是否实际上从procedure 获取值。
  • 好的,告诉我一件事txtBarCode.Text 正在获得价值,或者它还显示empty..

标签: asp.net multithreading gridview textbox task


【解决方案1】:

不要这样做:

Task.Factory.StartNew(() => FillMemberShipAndBarCode(dsMain.Tables[0].Rows[0]["CustomerCode"].ToString(), Ob.BranchId));

您这样做的目的是什么?

可能发生的情况是您的方法FillMemberShipAndBarCode 可能在 ASP.NET 已经将页面发送回浏览器之后运行。因此,基本上,对呈现的 HTML 没有可见的影响。

ASP.NET 不是做多线程工作的好地方。

尝试将上面的内容替换为:

FillMemberShipAndBarCode(dsMain.Tables[0].Rows[0]["CustomerCode"].ToString(), Ob.BranchId);

【讨论】:

  • 是的,可能就是这样。我认为这与我自己有关。它在Response 发送给客户端后被调用。那么,有没有办法在asp.net 中进行覆盖线程的工作?
  • 如果您真的想在客户端(浏览器)等待响应时执行后台操作,那么您没有理由不能使用 TPL 或其他技术 - 只需阻塞直到您的后台操作完成,然后对其做出反应(例如,通过更改文本框值等)。所以在这里,Task.Factory.StartNew() 不是无效的——它返回一个任务。保留对该任务的引用,并调用其 Wait() 方法。当该方法返回时,任务将完成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-04
相关资源
最近更新 更多