我在我的代码中发现了一个错误,我很喜欢这个错误。
我正在使用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的本地变量的值很好,并且发送了电子邮件。
我的问题是,为什么我的线程不能直接传递文本框值的值?
答案 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;
}
}
希望这有帮助。