2

私の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| プロジェクト内の広告。このメソッドは、呼び出されると待機します。

...
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();
    }
4

1 に答える 1

5

キャンセルは協力的です。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);
于 2012-11-27T14:53:09.697 に答える