ThreadPool QueueUserWorkItem问题ASP.NET

时间:2013-12-12 11:26:14

标签: c# asp.net multithreading

我在我的代码中发现了一个错误,我很喜欢这个错误。

我正在使用ThreadPool.QueueUserWorkItem在新线程中执行任务。

最初我的代码看起来像这样: -

var url = string.Format("{0}{1}", ConfigManager.SiteUrl, CanonicalUrl);

ThreadPool.QueueUserWorkItem(state => vice.WebsiteMessageService.SendSharePropertyMessage(url, txtEmailAddress.Text));

该错误是,当新线程触发我的方法时,它丢失了txtEmailAddress.Text的值,因此从未发送过电子邮件。

为了纠正这个问题,我做了一个简单的改变: -

var url = string.Format("{0}{1}", ConfigManager.SiteUrl, CanonicalUrl);
string emailAddress = txtEmailAddress.Text;
ThreadPool.QueueUserWorkItem(state => Service.WebsiteMessageService.SendSharePropertyMessage(url, emailAddress));

现在,Thread的本地变量的值很好,并且发送了电子邮件。

我的问题是,为什么我的线程不能直接传递文本框值的值?

1 个答案:

答案 0 :(得分:3)

这很可能是因为Text属性的实现使用了视图状态(反过来,它被延迟加载),并且当你的工作项被安排执行时,可能没有查看要解码的状态(因为默认情况下您的工作项没有可用的HTTP上下文)。

以下是相关代码(在JustDecompile的帮助下):

public virtual string Text
{
  get
  {
    string item = (string)this.ViewState["Text"];
    if (item != null)
    {
      return item;
    }

    return string.Empty;
  }
  set
  {
    this.ViewState["Text"] = value;
  }
}

希望这有帮助。