Несколько фоновых рабочих вызывают одну и ту же функцию с разными параметрами

1

У меня есть два фоновых работника, которые вызывают одну функцию в бесконечном цикле while, но с разными входными параметрами. В этой функции используется много переменных.

Вопрос: какой наилучший подход для определения переменных, используемых внутри функции?

Если я определяю переменные глобально, производительность велика. НО, я должен использовать блокировку много раз, чтобы убедиться в отсутствии конфликтов при изменении переменных.

Если я определяю переменные локально внутри функции, конфликт не будет (очевидно), но код будет в 2-3 раза медленнее. Это так, как ожидалось, потому что это точно так же, как определение переменных внутри цикла, а не определение их вне цикла.

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

Любое мнение/решение приветствуется.

Теги:
function
global-variables
backgroundworker

2 ответа

1
Лучший ответ

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

Хотя я не совсем понимаю, почему ваша производительность замедляется 2-3 раза, если вы определяете эти переменные в самой функции.

0

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

public void RunBackgroundWorkerOne()
{
    var myFunction = CreateFunction("Hello ", "World");

    while (true)
        myFunction();
}

public Func<string> CreateFunction(string value1, string value2)
{
    return (value1, value2) =>
    {
        return String.Format(value1, value2);
    };
}

Затем каждый работник фона получает свою собственную копию функции, построенной вокруг параметров, которые она хочет использовать.

В зависимости от того, насколько сложны параметры для создаваемой функции, вам может понадобиться создать класс "тип карты параметров", чтобы сделать код более понятным.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню