У меня из-за баджа нарушается работоспособность всего кода, показывает false, в переменную записывается как true
Не первый раз с этим приколом сталкиваюсь, не думаю, что я где-то косячу.
Вот кусок кода, он отвечает за проверку потока, выполнил ли он свою задачу, или нет.
for (int task = 0; task < taskarray.Length; task++)
{
bool whta = false;
bool aboba = false;
bool aboba1 = false;
bool amogus = false;
try
{
aboba = !freetasks.Contains(task);
aboba1 = freetasks[task] == -1;
amogus = taskarray[task].Status.Equals(TaskStatus.RanToCompletion);
whta = taskarray[task].Status == TaskStatus.RanToCompletion && (!freetasks.Contains(task) && freetasks[task] == -1);
}catch(Exception exc)
{ Console.WriteLine(exc); }
if (whta == true)
{
var status = taskarray[task].Status;
bool what = !freetasks.Contains(task);
AddAndSortArray(task);
}
}
...
private void AddAndSortArray(int task)
{
for(var taskplace = 0; taskplace<freetasks.Length; taskplace++)
{
if (freetasks[taskplace] == -1)
{
freetasks[taskplace] = task;
break;
}
}
}
Переменные я специально объявил, чтобы при отладке посмотреть, почему когда у меня должен быть false в if, возвращается true
Вот скриншоты, что происходит
Прикрепляю рабочий код +-, вместо while(true) Должно быть событие OnMessage, но тут я это не сделаю https://dotnetfiddle.net/DXCk35
Если запустить, видно, что создается кучу тасков, до завершения 2ух.
Ответы (1 шт):
Смотрите, у вас скорее всего race condition.
У вас в одном потоке идёт цикл RecerveFreeTasks (запущен через Task.Run), а в другом (Main) вы меняете freetasks и taskarray. Так делать нельзя хотя бы потому, что в момент сразу после чтения freetasks[i] внутри цикла значение может измениться.
Используйте mutex вокруг блоков изменений.

