1

データを取得するタスクがあります。変更するとタスクがキャンセルされ、タスクが再度開始されるという別のプロパティがありますが、以下に示す別のパラメーターを使用します。

private CancellationTokenSource CTS = new CancellationTokenSource();

private void LoadMyStuff(string parameter)
{          
     Task<List<Stuff>> loadStuff = new Task<List<Stuff>>(() => ServiceMethod(parameter));
     loadStuff.Start();
     loadStuff.ContinueWith((Sender) =>
     {
           foreach (var entry in Sender.Result)
           {
               if (!CTS.IsCancellationRequested)
               {
                   //Proccess my data      
               }
               else
               {
                   CTS.Cancel();
                   return;
               }
            }
     }, CTS.Token, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.FromCurrentSynchronizationContext());
     loadStuff.ContinueWith((Sender) =>
     {
          //Clean Up
     }, CTS.Token, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.FromCurrentSynchronizationContext());
 }

財産:

private Thing _myThing
public Thing MyThing
{
   get { return _myThing; }
   set 
     {
        _myThing= value;
        CTS.Cancel();
        LoadMyStuff(parameter); 
     }
}

したがって、私の問題は、このインスタンスでタスクが完了する前に、常にタスクをキャンセルしていることです。MyThingタスクの最初のインスタンスがキャンセルされたが、プロパティから起動された 2 番目のインスタンスが完了まで実行されるというこのシナリオを取得するにはどうすればよいですか?

4

1 に答える 1

3

新しい を作成する必要がありますCancellationTokenSource

aCancellationTokenSourceが通知されると、そのすべてのトークンも通知され、それらはそのままになります。したがって、新しいタスクを開始する場合は、まったく新しいトークン ソースが必要です。

于 2014-08-15T08:26:04.823 に答える