-4

System.Threading.Tasks を使用しています

ここにサンプルコードがあります::

ケース 1::

            List<string> testTerms = new List<string>();
            testTerms.Add("test1");
            testTerms.Add("test2");

            List<Task> lstTask = new List<Task>();

            foreach (string tTerm in testTerms)
            {
                Task<List<string>> task1 =
                Task<List<string>>.Factory.StartNew(() => SearchString());
                lstTask.Add(task1);
            }

            Task[] searchTasks = (Task[])lstTask.ToArray();
            Task.WaitAll(searchTasks.ToArray(), 1000);


        public List<string> SearchString()
        {
            .....
            Thread.Sleep(20000);
            return list;
        }

これで、すべてのタスクが完了するまで 1000 ミリ秒待機する必要があります。しかし、私は提供Thread.Sleep(20000);しましたSearchString() ので、何が起こるかは、私が提供したとしても、ここで20秒間待機しますTask.WaitAll(searchTasks.ToArray(), 1000); [これは予期されていません]

ここで、別のシナリオを考えてみましょう。

ケース 2

Task[] tasks = new Task[0]
         {
          Task.Factory.StartNew(() => SearchString())                                
          };

                     Task.WaitAll(tasks,1000);

Thread.Sleep(20000);この場合、 で提供した場合でも、1000 ミリ秒しか待機しませんSearchString()【想定内】

したがって、ケース 2は正常に動作していますが、ケース 1です。

では、ケース 1の問題点は何ですか?

4

1 に答える 1

2

問題を再現できません。CancellationToken の待機を間違えていると思います。

私のコード:

static void Main(string[] args)
{
    List<string> testTerms = new List<string>();
    testTerms.Add("test1");
    testTerms.Add("test2");

    List<Task> lstTask = new List<Task>();

    foreach (string tTerm in testTerms)
    {
        Task<List<string>> task1 =
        Task<List<string>>.Factory.StartNew(() => SearchString());
        lstTask.Add(task1);
    }

    Task[] searchTasks = (Task[])lstTask.ToArray();
    Console.WriteLine(DateTime.Now.ToString() + ": Waiting");
    Task.WaitAll(searchTasks.ToArray(), 1000);
    Console.WriteLine(DateTime.Now.ToString() + ": Done Waiting");
    Console.ReadKey();
}

public static List<string> SearchString()
{
    Thread.Sleep(20000);
    return new List<string>();
}

出力:

6/7/2013 10:05:05 AM: Waiting
6/7/2013 10:05:06 AM: Done Waiting

タスク スレッドは引き続き実行されますが、呼び出し元/制御スレッドは指定された時間より長く終了するまで待機しません。スレッドはキャンセルされませんが、その後は実行を継続してください。

于 2013-06-07T14:06:27.173 に答える