私の要件はこのようなものです。私は独立した仕事はほとんどなく、契約に従う仕事はほとんどありません。私のクライアントアプリケーションでは、Parallel Forループ内で独立したタスクが順番どおりに実行されるようにする必要がありますが、シーケンシャルな場合は順番に実行する必要があります。以下は私のコードです。おかげで、各ループの並列実行で順次実行
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Threading.Tasks;
namespace Sample
{
class Program
{
static void Main(string[] args)
{
Program p = new Program();
List<IContract> list = p.Run();
Parallel.ForEach(list, t=> t.Execute());
}
List<IContract> Run()
{
List<IContract> list = new List<IContract>();
Type[] typesInThisAssembly = Assembly.GetExecutingAssembly().GetTypes();
Array.ForEach(
typesInThisAssembly,
type =>
{
// If the type of this interface is not IChartView, continue the loop
if (type.GetInterface(typeof(IContract).ToString()) != null)
{
var contractObj = Activator.CreateInstance(type, new object[] { }) as IContract;
list.Add(contractObj);
}
});
return list;
}
}
public interface IContract
{
void Execute();
}
public class XMLJob : IContract
{
public void Execute()
{
Console.WriteLine("Step1: Getting data from XML");
}
}
public class DumpToDBJob : IContract
{
public void Execute()
{
Console.WriteLine("Step2: Dumping Data whihc came in XML");
}
}
public class IndependentJob1 : IContract
{
public void Execute()
{
Console.WriteLine("This is independent Job");
}
}
public class IndependentJob2 : IContract
{
public void Execute()
{
Console.WriteLine("This is independent Job ");
}
}
}
欲望はアウト
を置く。これは、独立した仕事 ステップ1です:XML からデータを取得するステップ2:データをダンプこれは独立した仕事 任意のキーを押して続行しにあるXML に来たwhihc。 。 。
私はあなただけの単一IContract
を持っている必要があり、順次すべてのタスクについては、この
Program p = new Program();
List<IContract> list = p.Run();
IContract xj = list.Find(i => i.GetType().ToString() == typeof(XMLJob).ToString());
IContract dj = list.Find(i => i.GetType().ToString() == typeof(DumpToDBJob).ToString());
list.Remove(xj);
list.Remove(dj);
Parallel.ForEach(list, l => l.Execute());
List<Task> tasks = new List<Task>();
Task t1 = Task.Factory.StartNew(xj.Execute);
Task t2 = t1.ContinueWith((antecedent)=>dj.Execute());
tasks.Add(t1);
tasks.Add(t2);
Task.WaitAll(tasks.ToArray());
質問がありますか? –
私の質問は、Step2がステップ1の後に来るかどうかを確認する方法です。その前に、 –