Повышение: Запустить и забыть асинхронный вызов функции?

Из предоставленного вами кода видно, что вы не запрашиваете ввод данных пользователем перед вызовом метода Work, поэтому ничего не произойдет, поскольку аргумент метода Work не передается.

Вы должны попробовать что-то вроде этого:

static void Main(string[] args)
    CaptureUserInput();
}

public static void WriteInstructions() {
    Console.WriteLine("Enter a number between 1 and 6 to perform a calculation");
    // instruct the user for each available operation
    Console.WriteLine("1: Addition");
    Console.WriteLine("2: Subtraction");
}

public static void CaptureUserInput() {
    WriteInstructions();

    // capture the user's input and convert it to an integer
    string stringInput = Console.Readline();
    int input = int.Parse(stringInput);

    // validate that it is a valid integer
    if (Enumerable.Range(1,6).Contains(input)) {
        // this is a valid number in the range we want, call the Work method
        Work(input);
    } else {
        // the user has entered an invalid entry, prompt them and wait for another attempt
        Console.WriteLine("Sorry, that is an invalid option.");
        CaptureUserInput();
    }
}

Обратите внимание, что это настройка, позволяющая рекурсивно обрабатывать, когда пользователь вводит что-то, что не является числом, или находится вне диапазона от 1 до 6. После этого пользователю будет предложено ввести что-то недопустимое, а затем дождаться следующей попытки ввода номера.

5
задан Chris Jester-Young 1 October 2008 в 00:58
поделиться

4 ответа

Хорошо можно вращать поток и затем никогда не присоединяться к нему снова. Что-то как:

boost::thread some_thread(&SomeFunction, param1, param2);

После того как some_thread переменная выходит из объема, поток выполнения будет отсоединен и не сможет быть присоединенным снова. Это - отходы для вращения потока, если время обработки этой функции не является значительным все же.

3
ответ дан 14 December 2019 в 09:05
поделиться

Я не использовал повышение:: поток в некоторое время, но я вижу быстрый пример на странице документации для класса:

void find_the_question(int the_answer);

boost::thread deep_thought_2(find_the_question,42);

Я верю, как только это заканчивает функцию, поток выйдет. Это не может быть тем, что Вы хотите в этом, после того как поток выходит из объема, он будет уничтожен. Если это не собирается работать, вероятно, необходимо создать длительный пул потоков и затем передать функторы как повышение:: свяжите составы.

3
ответ дан 14 December 2019 в 09:05
поделиться

Возможно, Вы хотите испустить сигнал?

Мне действительно понравилась функциональность сигналов и слотов QT, и я знаю, что Повышение имеет сигналы/слоты также. Я никогда не использовал сигналы/слоты в Повышении, все же.

0
ответ дан 14 December 2019 в 09:05
поделиться

В зависимости от того, как часто Вы делаете это, Вы могли бы быть лучшими от создания пула потоков, наряду с очередью заданий. Создание потока может создать много издержек, при попытке сделать это десятки времен в секунду. Если Вы не заботитесь о возвращаемом значении, которое делает это действительно легким.

Вращайте поток или два (или десять); имейте ориентированную на многопотоковое исполнение очередь функторов для вызова (свяжите параметры с функцией и поместите это на очередь); потоки ожидают на очереди чего-то для разоблачения, первый поток, который проснется, добирается для обработки работы. Когда поток сделан, выполнив задание, он ожидает на очереди снова.

Смотрите на этот проект для идеи одного способа сделать это.

Конечно, если бы Вы только выполняете вызовы asynchonous каждые несколько секунд для улучшения скорости отклика UI, было бы легче просто запустить новый поток каждый раз.

1
ответ дан 14 December 2019 в 09:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: