Multi await Task.Run обрабатывать - PullRequest
       7

Multi await Task.Run обрабатывать

0 голосов
/ 23 октября 2019

Я написал 2 обычных функции (длинная функция задачи) и хочу вызвать функцию асинхронно. Поэтому приведенный ниже код здесь

Public async void AsyncTask()
        {
            Form MainForm = await Task.Run(() => CreateAppForm());
            DataTable[] MasterTables = await Task.Run(() => CreateTables());
            // How to write code for below task run complete and go to next step ?
        }

        public DataTable[] CreateTables()
        {
            // Below code is create datatable from SQL DataTable
            DataTable [] MasterTables;
            return MasterTables;
        }

        public Form CreateAppForm ()
        {
            Form masterForm= new Form();
            // write some long task code 
            return masterForm;

        }

Я хочу, чтобы CreateTables и CreateForm выполнялись одновременно (параллельно), и основной поток должен дождаться завершения выполнения вышеупомянутой функции. Могу ли я узнать, как с этим справиться?

Спасибо.

Ответы [ 2 ]

3 голосов
/ 23 октября 2019

Оставляя в стороне вопрос о том, действительно ли это достигнет того, чего вы хотите ...

Если вы хотите запустить Task, вы просто создаете его. Если вам нужен результат Task, вы await его. Так что разделите строки, где вы начинаете Task и когда вы await это:

public async Task AsyncTask()
{
    //start the Tasks so they run concurrently
    var mainFormTask = Task.Run(() => CreateAppForm());
    var createTableTask = Task.Run(() => CreateTables());

    //await the Tasks and get the results
    Form MainForm = await mainFormTask;
    DataTable[] MasterTables = await createTableTask;
}

Но, опять же, я не совсем уверен, действительно ли это отличная идея (или сделает что-нибудь значимое) в этом конкретном сценарии.

0 голосов
/ 23 октября 2019

Использовать Thread.WaitAll ();См. Thread.WaitAll Method

var tasks = new[]
{
    Task.Factory.StartNew(() => DoSomething1()),
    Task.Factory.StartNew(() => DoSomething2()),
    Task.Factory.StartNew(() => DoSomething3())
};    
Task.WaitAll(tasks);
// Code below this line will execute after all asyncs have completed 
var x = "test";

EDIT: Теперь сохраняется возвращение асинхронного метода в переменные;

string return1 = string.Empty;
string return2 = string.Empty;

var tasks = new[]
{
    Task.Factory.StartNew(() => return1 = "First return"),
    Task.Factory.StartNew(() => return2 = "Second return"),
};

Task.WaitAll(tasks);
Console.WriteLine(return1); // First return
Console.WriteLine(return2); // Second return
...