почему захваченная переменная не содержит ссылку на экземпляр объекта - PullRequest
1 голос
/ 31 августа 2010

Как показано в коде ниже, я создаю поток в цикле foreach и запускаю его позднее, однако, когда я запускаю поток, я получаю сообщение об ошибке «ссылка на объект не установлена ​​для экземпляра объекта». Я подозреваю, что это проблема закрытия, но, похоже, я делаю все, что должен, чтобы избежать этого, создав локальную копию значения. Как можно исправить этот код, чтобы затем создать потоки, а затем в более позднее время, разрешив вызов методов (запуск потоков)?

foreach (ObjWithDelegateToCreateTrdFrom item in queryResult)
{
    // Capture object state    
    ObjWithDelegateToCreateTrdFrom capturedValue = item;

    // Create thread from object
    Thread thread = new Thread(() =>
    {
        capturedValue.Method.Invoke(capturedValue.paramsArray)
    });

    // Add thread to temp thread list
    trdList.Add(thread);
}

Ответы [ 2 ]

2 голосов
/ 31 августа 2010

Проверьте значения:

  1. capturedValue
  2. capturedValue.Method
  3. capturedValue.paramsArray

в лямбда-теле, то есть в момент выполнения потока.

Даже если они не равны NULL в момент создания потока, они могут быть установлены в NULL между временем инициализации объекта потока и временем выполнения решающим для его выполнения.

1 голос
/ 31 августа 2010

Попробуйте:

foreach (ObjWithDelegateToCreateTrdFrom item in queryResult)
{
    if (item == null)
    {
        throw new InvalidOperationException("Item is null");
    }

    if (item.Method == null)
    {
        throw new InvalidOperationException("Item.Method is null");
    }

    if (item.paramsArray == null)
    {
        throw new InvalidOperationException("Item.paramsArray is null");
    }

    // Create thread from object
    Thread thread = new Thread(() =>
    {
        capturedValue.Method.Invoke(capturedValue.paramsArray)
    });

    // Add thread to temp thread list
    trdList.Add(thread);
}

Если это не решит вашу проблему, пожалуйста, дайте нам трассировку стека с дополнительной информацией.

...