如果需要超过2分钟,我需要取消UpdateDatabase()函数。我已经尝试了 cancellationtokens 和计时器,但我无法解决这个问题(找不到合适的例子)。
你能帮帮我吗?
App.xaml.cs
protected override async void OnLaunched(LaunchActivatedEventArgs args)
{
await PerformDataFetch();
}
internal async Task PerformDataFetch()
{
await LocalStorage.UpdateDatabase();
}
LocalStorage.cs
public async static Task<bool> UpdateDatabase()
{
await ..// DOWNLOAD FILES
await ..// CHECK FILES
await ..// RUN CONTROLES
}
根据答案编辑我的课程。
App.xaml.cs 保持不变。编辑 UpdateDatabase(),并在 LocalStorage.cs 中添加新方法 RunUpdate():
public static async Task UpdateDatabase()
{
CancellationTokenSource source = new CancellationTokenSource();
source.CancelAfter(TimeSpan.FromSeconds(30)); // how much time has the update process
Task<int> task = Task.Run(() => RunUpdate(source.Token), source.Token);
await task;
}
private static async Task<int> RunUpdate(CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();
await ..// DOWNLOAD FILES
cancellationToken.ThrowIfCancellationRequested();
await ..// CHECK FILES
cancellationToken.ThrowIfCancellationRequested();
await ..// RUN CONTROLES
}
我知道这不是唯一的方式,可能会更好,但对于像我这样的新手来说,这是一个很好的开始。
答案 0 :(得分:5)
您需要将CancellationToken
传递给UpdateDatabase
函数,并在每次等待后通过调用ThrowIfCancellationRequested
检查令牌。见this
答案 1 :(得分:1)
你可以试试这个:
const int millisecondsTimeout = 2500;
Task updateDatabase = LocalStorage.UpdateDatabase();
if (await Task.WhenAny(updateDatabase, Task.Delay(millisecondsTimeout)) == updateDatabase)
{
//code
}
else
{
//code
}