Нужна помощь с потоками C#

262
16 ноября 2017, 02:00

Передо мной появилась такая задача: Создается n потоков, в каждый поток передается значение string, и в каждом потоке оно сравнивается в условии if. Задача такова, если условие в одном из потоков верно - отключить остальные потоки и продолжить выполнять код в этом потоке. Если во всех потоках условие неверно - выполнить немного другой код. Не получается это реализовать. Надеюсь на вашу помощь. Потоки вызываю таким образом:

var files = File.ReadAllLines(path + @"\Файл.txt", Encoding.Default); //Получаем текст из файла
for (int i = 0; i != files.Length; i++)   //Кол-во потоков = кол-ву строк в файле
{
    foreach (string line in files.ToList())
    {
        Thread mythread = new Thread(delegate () { thread(i, line); });
        mythread.Start();
    }
}

Работаю с методом:

static void thread(object obj,string line)
{
}
Answer 1

Вам понадобится, например, такая структура:

const int numberOfThreads = 3;
// для синхронизации выполнения потоков
Barrier barrier = new Barrier(numberOfThreads);
// для результатов
bool[] results = new bool[numberOfThreads];
// для синхронизации данных
object mutex = new object();
void Thread(int idx, string v)
{
    bool isGood = v.Contains(idx.ToString()); // как-то вычислили условие
    lock (mutex)
        results[idx] = isGood; // записали результат
    b.SignalAndWait(); // дождаться всех остальных потоков
    // в этой точке все результаты записаны
    bool allBad;
    lock (mutex) // читаем, все ли результаты плохие
        allBad = results.All(v => v == false);
    if (!allBad && !isGood) // если есть хорошие, но это не этот поток, отключаемся
        return;
    if (allBad)
    {
        // если ни у кого условие не выполнено, запускаем этот код
    }
    else
    {
        // иначе условие выполнено не у всех, но у нас выполнено.
        // запускаем этот код
    }
}

И запуск:

string v = "";
for (int i = 0; i < numberOfThreads; i++)
{
    var t = new Thread(() => T(i, v));
    t.Start();
}

Вам, вероятно, понадобится сохранить потоки для того, чтобы дождаться окончания их работы.

Кстати, подумайте о том, чтобы перейти от устаревших потоков к современным Task'ам.

READ ALSO
Заливка окружности цветом

Заливка окружности цветом

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

310
Как сохранить телеграмм бот в Visual Studio [требует правки]

Как сохранить телеграмм бот в Visual Studio [требует правки]

Всем доброго времени суток! Написал первый простенький телеграм бот на С#, суть в том что он проверяет записи в Гугл таблице и если на завтра...

333
Composition и Aggregation c#

Composition и Aggregation c#

У меня есть задача построить приложение кафеЕсть классы: Dish,Menu,Order

251
Создание игры на С#

Создание игры на С#

Хочу создать игру "вопросник" по типу "Кто хочет стать миллионером"Есть базовые знания С#, однако абсолютно не владею Windows Forms

506