【发布时间】:2016-03-06 19:33:36
【问题描述】:
我仍在处理异步编程,对如何修改以下内容有点困惑:
基本虚方法:
public virtual async Task OnSuspendingAsync(object s, SuspendingEventArgs e)
{
// do some housekeeping actions upon suspending in the base class
await Task.Yield();
}
覆盖方法:
public override Task OnSuspendingAsync(object s, SuspendingEventArgs e)
{
// do some housekeeping actions on exiting/suspending
return base.OnSuspendingAsync(s, e);
}
问题:
现在,如果我在重写方法中使用 awaitable(几乎不可避免),我需要通过添加 async 关键字将 public override Task 更改为 public override async Task,如下面的真实示例所示。
public override async Task OnSuspendingAsync(object s, SuspendingEventArgs e)
{
try
{
// tidy up app temporary folder on exit
await ApplicationData.Current.ClearAsync(ApplicationDataLocality.Temporary);
}
catch { }
return base.OnSuspendingAsync(s, e); // this is wrong with awaitable!
}
在这种情况下,return base.OnSuspendingAsync(s, e); 应该是什么(以及为什么)Visual Studio 正确地将其标记为错误?
【问题讨论】:
-
你不只是等待基本方法吗?
-
已经尝试过
return await base.OnSuspendingAsync(s, e);并认为它必须更多,因为 Visual Studio 仍然标记错误。这让我很困惑。 -
不,只需将
return替换为await。 -
在您的第一个覆盖示例中,您将返回由
base.OnSuspendingAsync()生成的Task。除了将它传递给重写方法的调用者之外,您没有做任何事情。在您的第二个覆盖示例中,您的方法通过异步生成 newTask。您的Task不返回任何内容,因此您的 return 语句是错误的。你只是想await你的基本任务。 -
这样想...如果您将方法声明为
async Task而不是async Task<T>...它很像void方法。它不直接返回任何类型的result。只需Task正在工作。
标签: c# asynchronous windows-runtime async-await uwp