У меня есть асинхронная задача, которая займет больше времени, чем основной поток. Основной поток завершается перед задачей async, и я не вижу результатов задачи Async, например, я не вижу записи БД, которую должна вставить задача async.

Вот мой код

Фреймворк 4.5

    public void Load(int id)
    {
        Task asynctask1;
        asynctask1 = CallWithAsync(id); // this is async task 
        task2(); // main thread
        task3(); // main thread

    }
    private async static Task CallWithAsync(int id)
    {
        string result = "";
        try
        {
            result = await InsertDataAsync(id);
        }
        catch (Exception ex)
        {
            //do some error logging
        }
        //return result;

    }
    static Task<string> InsertDataAsync(int id)
    {
        return Task.Run<string>(() =>
        {
            return InsertData(id);
        });
    }
    static string InsertData(int id)
    {

        try
        {

            System.Threading.Thread.Sleep(5000);//we have some code here which takes longer
            //code to insert DB record

        }
        catch (Exception ex)
        {
            //do some error logging
        }


        return "success";

    }


    public void task2()
    {
        //some thing
    }
    public void task3()
    {
        //some thing
    }
1
Abbi 8 Сен 2016 в 03:46

3 ответа

Лучший ответ

Дождитесь завершения задачи в конце метода:

public void Load(int id)
{
    Task asynctask1;
    asynctask1 = CallWithAsync(id);
    task2();
    task3();
    asynctask1.Wait(); // wait for async task to complete
}

Вы также можете использовать ключевое слово await, если добавите ключевое слово async в сам метод Load.

3
Will Ray 8 Сен 2016 в 00:57

Сделать Load async и дождаться звонка? У вас может быть метод async void, хотя было бы лучше, если бы это была асинхронная задача, и вы ждали ее дальше по цепочке вызовов.

public async void Load(int id)
{
  await CallWithAsync(id); // this is async task 
  task2(); // main thread
  task3(); // main thread
}
0
JimBobBennett 8 Сен 2016 в 01:54

Создайте Load метод async, ожидая asynctask1 после вызовов task2() и task3(). Обратите внимание: метод Load теперь возвращает Task вместо void

public async Task Load(int id)
{
    Task asynctask1;
    asynctask1 = CallWithAsync(id); // this is async task 
    task2(); // main thread
    task3(); // main thread
    var result = await asynctask1;
    Console.Writeline(result); //verify returned value of asynctask1 task 
}

private async static Task<string> CallWithAsync(int id)
{
    string result = "";
    try
    {
        result = await InsertDataAsync(id);
    }
    catch (Exception ex)
    {
        //do some error logging
    }
    return result;

}
0
alltej 9 Сен 2016 в 14:08