【问题标题】:AgrumenNullException in ThreadPool.QueueUserWorkItemThreadPool.QueueUserWorkItem 中的 AgrumenNullException
【发布时间】:2012-06-26 01:17:58
【问题描述】:

我有一个方法可以被不同的线程频繁调用。有时我在调用ThreadPool.QueueUserWorkItem(display(angebot), null); 时会收到AgrumenNullException,说明参数callBack(第一个参数)为空。

我做错了什么?


public class ai : UserControl
{
    //...
    public void Display(Angebote angebot)
    {
        lock (_syncObj) { _current = angebot; }
        ThreadPool.QueueUserWorkItem(display(angebot), null);
    }
    private WaitCallback display(Angebote angebot)
    {
        // doing something
    }
    //...
}

【问题讨论】:

  • 它告诉你你的 display() 方法返回了 null。从sn-p来看是相当可信的,没什么可看的。
  • 是的,你是对的。对不起!稍后我会添加一些内容。根据@Chris Sinclair 的回答,目前我正在更改代码。我的方法肯定会返回null,就像他猜的一样。

标签: c# threadpool argumentnullexception queueuserworkitem


【解决方案1】:

ThreadPool.QueueUserWorkItem 将完成display(Angebote) 返回的WaitCallback 委托中定义的工作。我推测您的 display 方法有时会返回 null。

您的意图是在后台线程中执行display(angebot),还是该方法识别应该执行什么方法?

如果您认为您的显示方法应该在后台线程中执行:

private WaitCallback display(Angebote angebot)
{
    // doing something in a background thread
}

那么你的代码应该是这样的:

ThreadPool.QueueUserWorkItem(display, angebot);

private void display(object state)
{
    Angebot angebot = (Angebot)state;
    // doing something in a background thread
}

编辑:如果是后者,display 正在确定要执行的后台线程,那么也许你有这样的东西:

private WaitCallback display(Angebote angebot)
{
    if (angebot.Something)
    {
         return new WaitCallback(BackgroundTask1);
    }
    else
    {
        return null;
    }
}

但是由于您尚未发布该代码,因此我不确定。在这种情况下,返回nullThreadPool.QueueUserWorkItem 无效。

【讨论】:

  • display 在后台被调用,是的......并且有时可能确实返回null。我会检查的。
  • 是的,这就是我所怀疑的。使用您当前的代码,display在后台线程中运行。您需要按照我在编辑前的建议修改您的代码。
猜你喜欢
  • 1970-01-01
  • 2011-09-05
  • 2011-03-04
  • 2014-07-29
  • 1970-01-01
  • 2014-01-08
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多