7

如果需要超过 2 分钟,我需要取消 UpdateDatabase() 函数。我已经尝试过取消令牌计时器,但我无法解决这个问题(找不到任何合适的例子)。

你能帮我解决这个问题吗?

应用程序.xaml.cs

protected override async void OnLaunched(LaunchActivatedEventArgs args)
{
   await PerformDataFetch();
}

internal async Task PerformDataFetch()
{
   await LocalStorage.UpdateDatabase();
}

本地存储.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
}

我知道这不是唯一的方法,而且可能会更好,但对于像我这样的新手来说,这是一个很好的起点。

4

2 回答 2

5

您需要将 a 传递CancellationTokenUpdateDatabase函数并在每次等待后通过调用来检查令牌ThrowIfCancellationRequested。看到这个

于 2013-07-31T11:37:07.577 回答
1

你可以试试这个:

const int millisecondsTimeout = 2500;
Task updateDatabase = LocalStorage.UpdateDatabase();
if (await Task.WhenAny(updateDatabase, Task.Delay(millisecondsTimeout)) == updateDatabase)
{
    //code
}
else
{
    //code
}
于 2013-08-20T07:09:29.247 回答