Запуск двух функций одновременно
Я хочу запускать две функции одна за другой, которые обращаются к третьей функции с условием, что, когда первая использует третью, вторая функция должна ждать. Он должен иметь возможность использовать третью функцию после первого периода доступа к третьей функции.
Эта концепция звучит как реализация циклического планирования с переключением контекста. Я знаю это теоретически, но я хочу применить это на практике. Как я могу добиться этого и сделать переключение контекста? Может ли кто-нибудь предоставить мне пример для этого? Есть ли другой способ добиться этого?
РЕДАКТИРОВАТЬ: На самом деле я рисую маркеры на картах Google, используя gmap.net. Я создал две функции потока для двух маркеров. Они будут извлекать необходимые данные из двух отдельных файлов. Конвертировать их в lat long и строить на map.with. При таком подходе я создаю дублирующие функции для обеих функций, имеющих одинаковую функциональность. Но я думаю, что это не очень хороший способ программирования, поэтому я хочу использовать одну общую функцию для построения и извлечения данных из файла для преобразования.
поэтому, когда один поток обращается к общей функции, другой должен подождать. После того, как первый выпустит функцию, или его период времени для работы над этой функцией будет превышен, он должен выполнить переключение контекста, а второй поток должен получить доступ к общей функции. Это то, чего я пытаюсь достичь. Если я должен изменить свой подход, пожалуйста, дайте мне знать.
1 ответ
Похоже, 2 задачи с блокировкой должны делать то, что вы хотите:
class Program
{
static void Main(string[] args)
{
var task1 = Task.Run(() => Func1());
var task2 = Task.Run(() => Func2());
Task.WaitAll(task1, task2);
}
static object lockObj = new object();
static void Func1()
{
for (int i = 0; i < 10; i++)
{
Func3("Func1");
Thread.Sleep(1);
}
}
static void Func2()
{
for (int i = 0; i < 10; i++)
{
Func3("Func2");
Thread.Sleep(1);
}
}
static void Func3(string fromFn)
{
lock(lockObj)
{
Console.WriteLine("Called from " + fromFn);
}
}
}
Блокировка предотвращает запуск вложенного кода более чем в одном потоке одновременно. (The Sleep
операторы предназначены только для замедления функций в демонстрационных целях - им не будет места в вашем конечном коде).
Выход:
Called from Func2
Called from Func1
Called from Func2
Called from Func1
Called from Func2
Called from Func1
Called from Func1
Called from Func2
Called from Func1
Called from Func2