У меня из-за баджа нарушается работоспособность всего кода, показывает 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 шт):

Автор решения: VladD

Смотрите, у вас скорее всего race condition.

У вас в одном потоке идёт цикл RecerveFreeTasks (запущен через Task.Run), а в другом (Main) вы меняете freetasks и taskarray. Так делать нельзя хотя бы потому, что в момент сразу после чтения freetasks[i] внутри цикла значение может измениться.

Используйте mutex вокруг блоков изменений.

→ Ссылка