Как ожидать выполнения одной задачи в двух разных потоках?

2

Могу ли я ждать в задаче, созданной в другом потоке? Например:

...
CurrentIteration = Execute(); // returns Task
await CurrentIteration;
...

А потом, по другой теме:

...
await CurrentIteration;
...
  1. Будет ли второй поток ждать метода Execute для завершения выполнения?
  2. Если это произойдет, смогу ли я повторно использовать CurrentIteration для этой же цели во втором потоке, учитывая, что я снова запускаю

CurrentIteration = Execute();//returns Task await CurrentIteration;

На первом потоке?

Я пробовал этот код:

public class Program
{
    public static void Main(string[] args)
    {
        MainAsync(args).GetAwaiter().GetResult();
    }
    public static async Task MainAsync(string[] args)
    {

        var instance = new SomeClass();
        var task = instance.Execute();
        Console.WriteLine("thread 1 waiting...");
        Task.Run(async () =>
        {
            Console.WriteLine("thread 2 started... waiting...");
            await task;
            Console.WriteLine("thread 2 ended!!!!!");
        });

        await task;

        Console.WriteLine("thread 1 done!!");

        Console.ReadKey();
    }
}


public class SomeClass
{
    public async Task Execute()
    {
        await Task.Delay(4000);
    }
}

Но он печатает

thread 1 waiting...
thread 2 started... waiting...

тогда

thread 1 done!!

но никогда thread 2 ended!!!!! , Почему это? Как я могу это достичь? Благодарю!

  • 2
    Вы не ожидаете задачи, которую начинаете. На самом деле, вы должны получить предупреждение в IntelliSense, говорящее вам только об этом. Если вы не ожидаете этого, иногда он будет выполняться до thread 1 done , иногда - нет.
  • 0
    вы имеете в виду , я должен поставить await перед тем Task.Run... ?
Показать ещё 8 комментариев
Теги:
multithreading
async-await
c#-7.0

1 ответ

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

Вы можете await задания из нескольких потоков. Вы действительно были очень близки, чтобы заставить это работать, как сказал @Rob, вам просто нужно было await второго потока.

учти это:

    public static async Task MainAsync(string[] args)
    {

        var instance = new SomeClass();
        var task = instance.Execute();
        Console.WriteLine("thread 1 waiting...");
        var secondTask = Task.Run(async () =>
        {
            Console.WriteLine("thread 2 started... waiting...");
            await task;
            Console.WriteLine("thread 2 ended!!!!!");
        });

        await task;

        await secondTask;

        Console.WriteLine("thread 1 done!!");

        Console.ReadKey();
    }

Добавьте ожидание на второй поток после того, как вы закончите выполнение задачи.

Причина, по которой вы не указали это указание, состоит в том, что консоль застряла в методе ReadKey и ничего не могла написать, пока она не закончилась. Если бы вы нажали Enter, вы увидите, что "поток 2 закончился !!!!!" на секунду до закрытия приложения.

Ещё вопросы

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