net core 2.0嵌套异步任务Await方法

时间:2018-02-20 17:39:50

标签: c# asynchronous .net-core task

我正在做Net core 2.0 Application

我正在测试nested async Task Await方法。我理解Async方法的含义,但是在嵌套方法中,我很难理解它。

我做了这个简单的例子,我得到了一个不良结果。

static void Main(string[] args)
{
    Testexample();
}

public static  void Testexample()
{
    try
    {
        Console.WriteLine("-------Main thread starting-------");
        Task task = GetStrLengthAsync();
        Console.WriteLine("Main thread contiune ..");
        Console.WriteLine("-------Main thread end-------");
    }
    catch (Exception ex)
    {
        string a = ex.Message + ((ex.InnerException != null) ? ex.InnerException.ToString() : "");
    }
}        


static async Task GetStrLengthAsync()
{
    Console.WriteLine("GetStrLengthAsync starting ");
    string str = await GetString2();
    for (int i = 0; i < 50; i++)
    {
        Console.WriteLine("VALUE JJJ" + i);
    }

    Console.WriteLine(str);
    Console.WriteLine("GetStrLengthAsync end");
}


static Task<string> GetString2()
{
    Console.WriteLine("GetString starting");
    return Task<string>.Run(() =>
    {
        for (int i = 0; i < 50; i++)
        {
            Console.WriteLine("VALUE I" + i);
        }
        return "GetString value";
    });
}

在这个例子中......

Main调用Testexample方法

Testexample调用GetStrLengthAsync(),,调用GetString2() 然后运行For int .. sequence ...

我发现的问题是,在返回GetString2()调用后,它退出GetStrLengthAsync()方法并且它不会运行For int.. sequence...

为什么?

如何在

后执行另一句话
string str = await GetString2();

1 个答案:

答案 0 :(得分:0)

你没有等待你的异步任务,你什么也不做呢

Task task = GetStrLengthAsync(); 

这只会创建一个等待该任务所需的任务,这意味着您需要从另一个异步函数调用它。但是你从同步函数调用它,所以你根本不会利用异步,只是创造了更多的问题

如果您尝试从同步功能调用异步功能,则需要调用

GetStrLengthAsync().Result

但这可能导致死锁,因为您没有配置等待。 Stephen Cleary的blog可以帮助您更好地理解异步

相关问题