我正在做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();
答案 0 :(得分:0)
你没有等待你的异步任务,你什么也不做呢
Task task = GetStrLengthAsync();
这只会创建一个等待该任务所需的任务,这意味着您需要从另一个异步函数调用它。但是你从同步函数调用它,所以你根本不会利用异步,只是创造了更多的问题
如果您尝试从同步功能调用异步功能,则需要调用
GetStrLengthAsync().Result
但这可能导致死锁,因为您没有配置等待。 Stephen Cleary的blog可以帮助您更好地理解异步