1

我刚刚安装了 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" };

        }

我正在处理 Result in 任务ContinueWith,但我想知道是否有更好的方法。

4

1 回答 1

1

使用await代替ContinueWithor Result

try
{
  List<string> area = await GetStringListAsync();
  area.ForEach((y) => Console.WriteLine(y));
}
catch (Exception ex)
{
  Console.WriteLine(ex.Message);
}

附带说明一下,您通常不应该将同步方法 ( GetStringList) 与伪异步方法(例如 using Task.Run)包装在一起。让调用者决定是否要将其推送到后台线程:

try
{
  List<string> area = await Task.Run(() => GetStringList());
  area.ForEach((y) => Console.WriteLine(y));
}
catch (Exception ex)
{
  Console.WriteLine(ex.Message);
}
于 2013-07-03T12:44:05.273 回答