【问题标题】:Cancel a static async function with a timeout取消带有超时的静态异步函数
【发布时间】:2013-07-31 21:18:42
【问题描述】:

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

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

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
}

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

【问题讨论】:

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


【解决方案1】:

您需要将CancellationToken 传递给UpdateDatabase 函数,并在每次等待后通过调用ThrowIfCancellationRequested 检查令牌。见this

【讨论】:

  • 另外,将令牌传递给您调用的每个需要令牌的方法。
【解决方案2】:

你可以试试这个:

const int millisecondsTimeout = 2500;
Task updateDatabase = LocalStorage.UpdateDatabase();
if (await Task.WhenAny(updateDatabase, Task.Delay(millisecondsTimeout)) == updateDatabase)
{
    //code
}
else
{
    //code
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-09
    • 2013-04-09
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多