任务类问题

时间:2015-06-02 09:47:55

标签: c# windows-phone-8 task

我正在尝试在Windows Phone 8.1应用程序中实现任务类。在我的应用程序中,任务是知道用户是否按下了后退键,完成了由于网络而发生的任务或故障。为此,我正在使用任务类的continue with()方法。不知道是什么问题。帮助我。

代码:

  await GetData(limit, offset).ContinueWith(t =>
                    {
                        //Console.WriteLine("task completed");

                        result = t.Result;
                        //throw new Exception("task 2 error");
                    }, TaskContinuationOptions.OnlyOnRanToCompletion).ContinueWith(t =>
                    {
                        //Console.WriteLine("task fault");
                        //throw new Exception("task 2 error");
                    }, TaskContinuationOptions.OnlyOnFaulted).ContinueWith(t =>
                    {
                       // Console.WriteLine("task cancelled");
                        //throw new Exception("task 2 error");
                    }, TaskContinuationOptions.OnlyOnCanceled);

                 );

我不知道问题是什么,所以需要帮助。

1 个答案:

答案 0 :(得分:2)

如果您有ContinueWith / async的访问权限,请勿使用await。就这么简单。 ContinueWith将允许您执行与新关键字相同的所有操作,但更难以阅读,理解,使用和维护。除非你真的真的必须这样做,否则不要使用它。

您的代码变为

try
{
    result = await GetData(limit, offset);
}
catch(TaskCancelledException)
{
    // GetData has been cancelled
    // Console.WriteLine("task cancelled");
    //throw new Exception("task 2 error");
}
catch(Exception)
{
    //GetData has been faulted
    //Console.WriteLine("task fault");
    //throw new Exception("task 2 error");
}

现在了解你的意思要容易得多。

修改

这里似乎需要进一步澄清。从根本上使用await关键字与使用ContinueWith相同。它只允许您以更简洁易读的方式编写复杂的异步逻辑。

async Task DoAsyncWork()
{
    var a = await GetAAsync();
    Frob(a);
}

完全相同
//Notice there is no async keword here
Task DoAsyncWork()
{
    return GetAAsync().ContinueWith(t => Frob(t.Result),
        TaskContinuationOptions.OnlyOnRanToCompletion);
}

同样,内部带有try/catch的{​​{1}}块相当于awaitContinueWithTaskContinuationOptions展开的相当复杂的表达式。 如果您添加两个或更多AggregateException或某些Tasks链接的可能性,以及一些好的度量循环(iffor,它会变得复杂得多或foreach,这并不重要)。如果你坚持使用你的while枪,你会得到那种没有理智的人会想写的代码。那没关系,因为为你编写它是编译器的工作。编译器不是一个理智的人。所以,只要你能坚持到等待。

如果你不能使用ContinueWith(显然不是你的情况,你正在为WP8编程),可以哭泣,因为你有很多潜在的伤害。一些扩展方法会让你的生活更轻松,但它仍然不会很漂亮。