У меня есть два фоновых работника, которые вызывают одну функцию в бесконечном цикле while, но с разными входными параметрами. В этой функции используется много переменных.
Вопрос: какой наилучший подход для определения переменных, используемых внутри функции?
Если я определяю переменные глобально, производительность велика. НО, я должен использовать блокировку много раз, чтобы убедиться в отсутствии конфликтов при изменении переменных.
Если я определяю переменные локально внутри функции, конфликт не будет (очевидно), но код будет в 2-3 раза медленнее. Это так, как ожидалось, потому что это точно так же, как определение переменных внутри цикла, а не определение их вне цикла.
Одним из решений является создание другой копии этой функции и определение отдельных глобальных переменных для использования для второго потока и второй функции, вызываемой в этом потоке. Это может быть хорошо с точки зрения производительности, но я считаю, что это не самый элегантный подход.
Любое мнение/решение приветствуется.
Создайте класс, содержащий свойства для всех переменных. Попросите каждого BackgroundWorker создать свой собственный экземпляр этого класса и передать его функции в качестве аргумента.
Хотя я не совсем понимаю, почему ваша производительность замедляется 2-3 раза, если вы определяете эти переменные в самой функции.
Являются ли параметры из каждого фонового рабочего эффективно "постоянными"? Если это так, вы можете создать функцию, которая возвращает функцию - ее похожее на решение, которое вы придумали, но более элегантное, потому что вам действительно не нужно делать копии функции. Здесь тривиальный пример:
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);
};
}
Затем каждый работник фона получает свою собственную копию функции, построенной вокруг параметров, которые она хочет использовать.
В зависимости от того, насколько сложны параметры для создаваемой функции, вам может понадобиться создать класс "тип карты параметров", чтобы сделать код более понятным.