我刚刚安装了Visual Studio 2012,所以我终于可以测试C#5.0的功能了 像async / await。我正在做一些测试,我想到了一个疑问。 处理任务结果的最佳方法是什么。
给出以下代码段:
Task<List<string>> tarea = GetStringListAsync();
tarea.ContinueWith((x) =>
{
if (x.Status == TaskStatus.RanToCompletion)
{
x.Result.ForEach((y) => Console.WriteLine(y));
}
else if (x.Status == TaskStatus.Faulted)
{
Console.WriteLine(x.Exception.InnerException.Message);
}
});
private static async Task<List<string>> GetStringListAsync()
{
return await Task.Run(() =>
{
return GetStringList();
});
}
private static List<string> GetStringList()
{
//I uncomment this to get forced exception
//throw new Exception("Error Occurred");
//Add some delay
System.Threading.Thread.Sleep(12000);
return new List<string>() { "String1", "String2", "String3" };
}
我在ContinueWith
处理任务结果,但我想知道是否有更好的方法。
答案 0 :(得分:1)
使用await
代替ContinueWith
或Result
:
try
{
List<string> area = await GetStringListAsync();
area.ForEach((y) => Console.WriteLine(y));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
作为旁注,您should usually not wrap synchronous methods (GetStringList
) with a fake-asynchronous methods(例如,使用Task.Run
)。让调用者决定是否要将其推送到后台线程:
try
{
List<string> area = await Task.Run(() => GetStringList());
area.ForEach((y) => Console.WriteLine(y));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}