gpt4 book ai didi

c# - 如何在一段时间后取消异步任务

转载 作者:行者123 更新时间:2023-12-02 05:22:51 25 4
gpt4 key购买 nike

在我的 Windows 应用商店应用程序中我有一个方法

public async static Task InitAds()
{
Debug.WriteLine("API: Loading Ad images");
await Task.WhenAll(ads.Select(l => l.Value).Where(l=>l!=null).Select(l => l.StartRotation()));
}

我在一个项目中用来下载和初始化(download, parse| Ads。这个方法在调用的时候等待

...
await AdReader.InitAds()
...

问题是广告服务器有时响应很慢。我想要超时,比如说 10 秒让这个方法运行。如果它没有在此超时内完成,我希望它被杀死并继续我的代码。

实现它的最佳方法是什么?我找到了 How to cancel a Task in await?但它使用 TaskFactory,当我尝试该方法并在 Task.Run 中调用我的方法时,它不会等待并且代码会继续。

编辑:

StartRotation 也是调用另一个异步方法的异步方法

public async Task StartRotation(CancellationToken ct)
{
if (Images.Count == 1)
{
await Image.LoadAndSaveImage(ct);
}

if (Images.Count <2) return;

foreach (var img in Images)
{
await img.LoadAndSaveImage(ct);
}

Delay = Image.Delay;
DispatcherTimer dt = new DispatcherTimer();
dt.Interval = TimeSpan.FromMilliseconds(Delay);
dt.Tick += (s, e) =>
{
++index;
if (index > Images.Count - 1)
{
index = 0;
}
Image = Images[index];
};
dt.Start();
}

最佳答案

取消是合作的。您只需将 CancellationToken 传递到您的 StartRotation 中:

public async static Task InitAds(CancellationToken token)
{
Debug.WriteLine("API: Loading Ad images");
await Task.WhenAll(ads.Select(l => l.Value).Where(l=>l!=null).Select(l => l.StartRotation(token)));
}

然后这样调用它:

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
await InitAds(cts.Token);

关于c# - 如何在一段时间后取消异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13586479/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com