Member 13788771 Ответов: 1

C# backgroundworker, использующий Кортеж в качестве аргумента объекта, не найден?


Я пытаюсь отправить аргумент фоновому работнику, я хочу, чтобы этот аргумент был объектом кортежа.

по какой-то причине я получаю исключение nullreferenceException, когда хочу извлечь список из аргумента и не могу понять, почему.

System.NullReferenceException: "The object reference is not set on an instance of an object."


Что я уже пробовал:

//global var
public static List<informatie> LsLotto = new List<informatie>();
BackgroundWorker Worker;


form_load(){
   //background worker
   Worker = new BackgroundWorker();
   Worker.DoWork += new DoWorkEventHandler(worker_function);
  
   // here I fill op the list

}


function1(){
    Tuple<List<informatie>, int> tuple = new Tuple<List<informatie>, int>(LsLotto, 2);
    Worker.RunWorkerAsync(tuple);   
}



worker_function(object sender, DoWorkEventArgs e){
    //extracting the list
  Tuple < List < informatie >, int> tuple = e.Argument as Tuple<List<informatie>, int>;
  List<informatie> gegevens = (List<informatie>)tuple.Item1 ; // <-- line of error (erorr seen above) 
}

Ziee-M

Я думаю, что у вас есть проблема в другом месте, я использовал ваш код, и он работал, единственное отличие, я использовал список<string> Вместо ur object informatie

Ziee-M

вы приводили в пример своего фонового работника?
BackgroundWorker Worker = новый BackgroundWorker();

Member 13788771

Подождите, я действительно создал экземпляр worker таким образом, и когда форма загружается, я добавил к ней событие. я обновил свой код. Кроме того, я не могу получить целое число " 2 " .. это дает ту же ошибку.

Ziee-M

Где вы заполняете свой объект "LsLotto"? Кроме того, в вашем комментарии под приведенным ниже решением кортеж равен нулю или его список равен нулю?

Ziee-M

Где вы заполняете свой объект "LsLotto"? Кроме того, в вашем комментарии под приведенным ниже решением кортеж равен нулю или его список равен нулю?

Member 13788771

WOOOW нашел его, в function1 у меня был if else, где оба условия запускают код, показанный в function1 выше, но в операторе else я забыл вставить аргумент... извините, что потрудился потратить ваше время!

1 Ответов

Рейтинг:
12

OriginalGriff

Это одна из самых распространенных проблем, которые нам задают, и это также та, на которую мы меньше всего готовы ответить, но вы больше всего готовы ответить сами.

Позвольте мне просто объяснить, что означает ошибка: вы пытались использовать переменную, свойство или возвращаемое значение метода, но оно содержит null - что означает, что в переменной нет экземпляра класса.
Это немного похоже на карман: у вас есть карман в рубашке, который вы используете, чтобы держать ручку. Если вы сунете руку в карман и обнаружите, что там нет ручки, вы не сможете подписать свое имя на листе бумаги - и вы получите очень смешные взгляды, если попытаетесь! Пустой карман дает вам нулевое значение (здесь нет ручки!), поэтому вы не можете сделать ничего, что обычно делали бы, когда вы извлекли свою ручку. Почему он пуст? Вот в чем вопрос - может быть, вы забыли взять ручку, когда уходили из дома сегодня утром, или, возможно, вы оставили ручку в кармане вчерашней рубашки, когда снимали ее вчера вечером.

Мы не можем сказать, потому что нас там не было, и, что еще важнее, мы даже не можем видеть вашу рубашку, не говоря уже о том, что находится в кармане!

Вернемся к компьютерам, и вы каким - то образом сделали то же самое-и мы не можем увидеть ваш код, а тем более запустить его и узнать, что содержит null, когда это не должно быть.
Но вы можете - и Visual Studio поможет вам здесь. Запустите свою программу в отладчике, и когда она выйдет из строя, VS покажет вам строку, в которой она обнаружила проблему. Затем вы можете начать просматривать различные его части, чтобы увидеть, какое значение равно null, и начать просматривать свой код, чтобы узнать, почему. Поэтому поставьте точку останова в начале метода, содержащего строку ошибки, и снова запустите программу с самого начала. На этот раз VS остановится перед ошибкой и позволит вам изучить, что происходит, пройдя через код, глядя на ваши значения.

Но мы не можем этого сделать - у нас нет вашего кода, мы не знаем, как его использовать, если бы он у нас был, у нас нет ваших данных. Так что попробуйте - и посмотрите, сколько информации вы можете узнать!


Цитата:
Я обновил код, Но да, если я поставлю точку останова и посмотрю на аргумент e, он будет установлен в "null". Но ИДК почему, потому что я действительно ввел Кортеж в качестве аргумента, верно?
Ну, когда я попробую это сделать:
private class informatie { }
List<informatie> LsLotto = new List<informatie>();
BackgroundWorker Worker;
private void worker_function(object sender, DoWorkEventArgs e)
    {
    //extracting the list
    Tuple<List<informatie>, int> tuple = e.Argument as Tuple<List<informatie>, int>;
    List<informatie> gegevens = (List<informatie>)tuple.Item1; // <-- line of error (erorr seen above)
    }
private void MyButton_Click(object sender, EventArgs ew)
    {
    Worker = new BackgroundWorker();
    Worker.DoWork += new DoWorkEventHandler(worker_function);
    Tuple<List<informatie>, int> tuple = new Tuple<List<informatie>, int>(LsLotto, 2);
    Worker.RunWorkerAsync(tuple);
Я получаю Кортеж в кортеже, и gegevens становится пустым списком без каких-либо проблем.

И что... именно так... делаю ли я это по-другому, учитывая, что я скопировал основной код с вас? :смеяться:
Даже если я поставлю null вместо списка:
Tuple<List<informatie>, int> tuple = new Tuple<List<informatie>, int>(null, 3);//LsLotto, 2);
Я не получаю исключения, я просто получаю нуль в gegevens.


Member 13788771

Я обновил код, Но да, если я поставлю точку останова и посмотрю на аргумент e, он будет установлен в "null". Но ИДК почему, потому что я действительно ввел Кортеж в качестве аргумента, верно?

OriginalGriff

Ответ обновлен.

Member 13788771

Спасибо, что потратили на это свое время, я ошибся с условием if/else.. Я думал, что он вошел внутрь if, но вошел в else, где я не ставил никаких аргументов.. так глупо с моей стороны.

OriginalGriff

:смех: мы все совершаем ошибки - и вы не поверите, как часто я читаю то, что хотел написать, а не то, что написал ... :O