使用超时取消静态异步功能

时间:2013-07-31 11:17:15

标签: c# windows-runtime microsoft-metro c#-5.0 winrt-async

如果需要超过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
}

我知道这不是唯一的方式,可能会更好,但对于像我这样的新手来说,这是一个很好的开始。

2 个答案:

答案 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
}