Попытка передать элемент массива строк в функцию, которая вызывается в Task.Run.Кто-нибудь знает, в чем здесь ошибка?
Код здесь не работает, он ведет себя так, как будто ProcessElem никогда не вызывается.
string[] arr = message.Split(new string[] {"\n"}, StringSplitOptions.None);
for (int i = 0; i < arr.Length; i++) {
if(arr[i] != "") {
var t = Task.Run(() => this.ProcessElem(arr[i]));
}
}
Однако приведенный ниже код работает
string[] arr = message.Split(new string[] {"\n"}, StringSplitOptions.None);
for (int i = 0; i < arr.Length; i++) {
if(arr[i] != "") {
var tmp = arr[i];
var t = Task.Run(() => this.ProcessElem(tmp));
}
}
Я очень новичок в том, как C # делает вещи, но кажется, что оба шаблона небезопасны, потому что функция, которая вызывает Task.Run() может вернуться до выполнения функции ProcessElem, и если строки передаются по ссылке, они будут уничтожены до вызова ProcessElem.
Если это так, как лучше всего передать строку в ProcessElem?
Кроме того, почему первая версия на самом деле не "вызывает" ProcessElem?У меня есть оператор печати в верхней части ProcessElem, и он печатается только во второй версии.