2012-06-24 3 views
0

У меня есть метод, который часто вызывается разными шагами. Иногда я получаю исключение AgrumenNullException, когда вызывается ThreadPool.QueueUserWorkItem(display(angebot), null);, заявляя, что параметр callBack (первый параметр) имеет значение NULL.AgrumenNullException в ThreadPool.QueueUserWorkItem

Что я делаю неправильно?


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 
    } 
    //... 
} 
+2

Сообщаем вам, что ваш метод display() возвратил null. Который из фрагмента вполне правдоподобен, на что смотреть нечего. –

+0

Да, ты прав. Сожалею! Я добавляю некоторый контент позже. В настоящее время я меняю код, согласно Aanswer of @Chris Sinclair. Мой метод определенно возвращает «null», как он догадывался. –

ответ

1

The ThreadPool.QueueUserWorkItem будет делать свою работу, как это определено в WaitCallback делегатом возвращенного display(Angebote). Я бы предположил, что ваш метод 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 
} 

EDIT: Если это последний, где display выясняет, какой фоновый поток выполнить, то, возможно, у вас есть что-то похожее на это:

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

Но так как вы не разместили этот код, я не уверен. В этом случае возврат null недействителен для ThreadPool.QueueUserWorkItem.

+0

'display' вызывается в фоновом режиме, да ... и может действительно возвращать' null' иногда. Я проверю это. –

+0

Да, так я и подозревал. С вашим текущим кодом 'display' работает _not_ в фоновом потоке. Вам нужно изменить свой код, как я предложил перед редактированием. –

Смежные вопросы