Как заставить метод начать новое выполнение только после завершения предыдущего выполнения - PullRequest
0 голосов
/ 28 апреля 2020

Здравствуйте. Как заставить метод MethodA начать новое выполнение только после завершения предыдущего выполнения?

public class Program
{
    public static void Main()
    {
        Console.WriteLine("Hello World");
        MethodB();
        MethodC();
    }

    public static void MethodA ()
    {
        Console.WriteLine("Start");
        Thread.Sleep(200);
        Console.WriteLine("Stop");
    }

    public static void MethodB()
    {
        Task.Run(() => MethodA());
    }

    public static void MethodC()
    {
        Task.Run(() => MethodA());
    }
}

В этом случае у меня есть этот результат

Hello World
Start
Start
Stop
Stop

Но мне нужно что-то вроде этого

Hello World
Start
Stop
Start
Stop

Ответы [ 2 ]

1 голос
/ 28 апреля 2020

Самый простой способ - создать объект блокировки c и ссылку на него в MethodA:

private static readonly object _methodALockObject = new object();

public static void MethodA()
{
    lock(_methodALockObject)
    {
        Console.WriteLine("Start");
        Thread.Sleep(200);
        Console.WriteLine("Stop");
    }
}
0 голосов
/ 28 апреля 2020

Попробуйте использовать async и await:

public static void Main()
{   
    Task.Run(async () =>
    {
         await MethodB();
         await MethodC();
    }).GetAwaiter().GetResult();
}

public static void MethodA()
{
    Console.WriteLine("Start");
    Thread.Sleep(200);
    Console.WriteLine("Stop");
}

public async static Task MethodB()
{
    await Task.Run(() => MethodA());
}

public async static Task MethodC()
{
    await Task.Run(() => MethodA());
}

async и await ключевые слова помогут сделать ваш асинхронный код выполненным в синхронном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...