簡體   English   中英

如何在一段時間后取消異步任務

[英]How to cancel async Task after a period of time

在我的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()));
 }

我用來下載和初始化(下載,解析|項目中的廣告。調用此方法時等待

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

問題是廣告服務器有時響應非常慢。 我希望有一個超時,比如這個方法運行10秒。 如果它沒有在此超時完成,我希望它被殺死,我的代碼繼續。

實現這個的最佳方法是什么? 我找到了如何在等待中取消任務? 但它使用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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM