SORU
13 NİSAN 2012, Cuma


Nasıl bekliyor bir Görevi iptal etmek için?

Bu Windows 8 WinRT görevleri oynuyorum ve bir görev aşağıdaki yöntemi kullanarak iptal etmeye çalışıyorum, ve bir yerde çalışıyor. Bu CancelNotification yöntem Mİ denir, hangi düşünüyorsun görev iptal oldu, ama arka planda görev çalıştırma tutar, sonra tamamlanmadan, bu durum Görevi her zaman tamamlanmış ve asla iptal etti. Bir şekilde tamamen iptal olunca görevi durdurmak için var?

private async void TryTask()
{
    CancellationTokenSource source = new CancellationTokenSource();
    source.Token.Register(CancelNotification);
    source.CancelAfter(TimeSpan.FromSeconds(1));
    var task = Task<int>.Factory.StartNew(() => slowFunc(1, 2), source.Token);

    await task;            

    if (task.IsCompleted)
    {
        MessageDialog md = new MessageDialog(task.Result.ToString());
        await md.ShowAsync();
    }
    else
    {
        MessageDialog md = new MessageDialog("Uncompleted");
        await md.ShowAsync();
    }
}

private int slowFunc(int a, int b)
{
    string someString = string.Empty;
    for (int i = 0; i < 200000; i  )
    {
        someString  = "a";
    }

    return a   b;
}

private void CancelNotification()
{
}

CEVAP
13 NİSAN 2012, Cuma


Cancellation. tanıtılan (okumaasync yöntemleri ile NET büyük ölçüde değişmeden 4.0 ve o zamandan beri) ve CancellationToken nasıl kullanılacağı hakkında yönergeler sağlar Task-Based Asynchronous Pattern,.

Özetlemek gerekirse, iptali destekleyen CancellationToken her bir yöntem geçirmek ve bu yöntem belirli aralıklarla kontrol etmek gerekir.

private async Task TryTask()
{
  CancellationTokenSource source = new CancellationTokenSource();
  source.CancelAfter(TimeSpan.FromSeconds(1));
  Task<int> task = Task.Run(() => slowFunc(1, 2, source.Token), source.Token);

  // (A canceled task will raise an exception when awaited).
  await task;
}

private int slowFunc(int a, int b, CancellationToken cancellationToken)
{
  string someString = string.Empty;
  for (int i = 0; i < 200000; i  )
  {
    someString  = "a";
    if (i % 1000 == 0)
      cancellationToken.ThrowIfCancellationRequested();
  }

  return a   b;
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kevin Bruckert

    Kevin Brucke

    30 Aralık 2006
  • Sorikan

    Sorikan

    3 ŞUBAT 2008
  • vgeller1

    vgeller1

    22 Kasım 2009