4
var hs = new HashSet<int>();

foreach(var item in mainclass)
{
    Task<List<Class1>> cl1Task = Task.Factory.StartNew<List<Class1>>(() =>
    {
        if (!hs_VersiodIDs.Contains(item.VersionID))
        {
             return new List<Class1>(.....);
        }
        else
        {
            return null;
        }
    });

    Task.WaitAll(cl1Task );
}

タスクが完了するのを待ちません。問題は return null にあるため、空のタスクを返すにはどうすればよいですか?

4

1 に答える 1

2

あなたのコードは、次の 2 つの理由で意味がありません。

  1. 実行時間の長いコードを含まないタスクを開始しても意味がありません。これで何のメリットも得られない
  2. タスクを開始した直後にタスクが終了するのを待つと、タスクの効果が完全に無効になります。メイン スレッドをブロックしたままです。

タスクのコードが本当に単純な場合は、コードを次のように変更します。

foreach(var item in mainclass) 
{
    List<Class1> result;
    if (!hs_VersiodIDs.Contains(item.VersionID)) 
    { 
         result = new List<Class1>(.....); 
    } 
    else 
    { 
        result = null; 
    } 
} 

タスク内のコードが実際に高価な処理を行う場合は、コードを次のように変更します。

var tasks = new List<Task>();
foreach(var item in mainclass)     
{     
    Task<List<Class1>> cl1Task = Task.Factory.StartNew<List<Class1>>(() =>     
    {     
        if (!hs_VersiodIDs.Contains(item.VersionID))     
        {     
             return new List<Class1>(.....);     
        }     
        else     
        {     
            return null;     
        }     
    });     

    tasks.Add(cl1Task); 
} 

// note, WaitAll is outside the loop, so now our tasks can all run in parallel
Task.WaitAll(tasks.ToArray());
于 2012-09-11T11:26:16.780 に答える