处理任务结果的最佳设计模式(等待/异步)

时间:2013-07-03 12:42:04

标签: c# .net asynchronous task

我刚刚安装了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处理任务结果,但我想知道是否有更好的方法。

1 个答案:

答案 0 :(得分:1)

使用await代替ContinueWithResult

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);
}