3

時間のかかる方法があります。

public class TimeConsumingClass
{
   public void TimeConsumingMethod()
   {
      //let's imagine my method works this way
      for (var i = 0; i < 10000; i++)
         Thread.Sleep();
   }
}

以前はメインスレッドで実行されていました。次に、UIをブロックしないように、セカンダリスレッドで呼び出す必要がありました。

Task.Factory.StartNew(() => { new TimeConsumingClass().TimeConsumingMethod(); });

そして今、私はいつでもこのメソッドを停止できるようにする必要があります。したがって、メソッドにCancellationTokenを何らかの方法で処理させると同時に、このメソッドを同期的に(CancellationTokenなしで)呼び出す可能性を維持したいと思います。私が思いついた最良のアイデアは、オプションのCancellationToken引数をメソッドに追加することです。これは、デフォルトでnullになります(同期呼び出しの場合)。

public class TimeConsumingClass
{
   public void TimeConsumingMethod(CancellationToken cancellationToken = null)
   {
      //let's imagine my method works this way
      for (var i = 0; i < 10000; i++)
      {
         if (cancellationToken.IsCancellationRequested)
           return;
         Thread.Sleep();
      }
   }
}

しかし、最近.NETマルチスレッドには多くの革新があり、これからやろうとしていることを実行するためのより良い方法だと感じています。ありますか?

4

1 に答える 1

3

それを行うためのより「現代的な」方法を探しているなら、最善の策は、c#の新しいキーワードasyncとキーワードを研究することです。awaitこれらは、非同期性を実装するための最も簡単な方法です。

asyncあなたはここにそしてここに良い入門書を見つけることができますawait

Async and Awaitを使用した非同期プログラミング(C#およびVisual Basic)
http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

進行状況を報告し、非同期メソッドをキャンセルする方法については、こちらをお読みください。

4.5での非同期:非同期APIでの進行状況とキャンセルの有効化
http://blogs.msdn.com/b/dotnet/archive/2012/06/06/async-in-4-5-enabling-progress-and-cancellation-in -async-apis.aspx

質問で使用しているのと同じスタイルのコードでタスクをキャンセルするには、次を参照してください。

タスクのキャンセル
http://msdn.microsoft.com/en-us/library/dd997396.aspx

于 2013-03-15T17:54:22.677 に答える