【问题标题】:ThreadPool QueueUserWorkItem Issue ASP.NETThreadPool QueueUserWorkItem 问题 ASP.NET
【发布时间】:2013-12-12 19:35:35
【问题描述】:

我在我的代码中发现了一个错误,我希望得到一个很好的解释。

我正在使用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 有了我的局部变量的值,并且发送了电子邮件。

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

【问题讨论】:

  • 我不明白为什么这被否决了。在我看来,这是一个完全有效的问题。

标签: c# asp.net multithreading


【解决方案1】:

这很可能是因为 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;
  }
}

希望这会有所帮助。

【讨论】:

  • 谢谢,这完美地解释了问题。
猜你喜欢
  • 1970-01-01
  • 2019-02-01
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 2011-02-09
  • 2011-07-25
  • 2011-10-15
  • 2014-02-26
相关资源
最近更新 更多