抽象的な質問で申し訳ありませんが、サイクルで同等の操作を行うアプリケーションの種類に関するサンプル/アドバイス/記事を探しています。サイクルのすべての反復は、特定の時間 (たとえば、10 秒) で結果を公開する必要があります。 .
私のアプリケーションは、外部 WCF サービスとローカル データベースの間でデータの同期を行います。すべての反復で、アプリケーションは WCF サービスに要求を渡すデータの変更を取得し、変更をデータベースに配置します。その逆も同様です。このアプリケーションの最も厳しい要件の 1 つは、反復を 10 秒ごとに実行することです。
ここで問題が発生します。反復が 10 秒以内に終了することを保証するにはどうすればよいですか?
このタイプのアプリケーションは、リアルタイム アプリケーション (リアルタイム OS の意味で) と呼ばれていると思います。
私たちが使用する DAL コンポーネントは、接続タイムアウトの動作にランダムに作用します。そのため、DB 操作には 10 秒以上かかる場合があります。
1回の反復の推定コードは次のとおりです。
Stopwatch s1 = new Stopwatch();
s1.Start();
Parallel.ForEach(Global.config.databases, new ParallelOptions { MaxDegreeOfParallelism = -1 }, (l) =>
{
Console.WriteLine("Started for {0}", l.key.name);
DB db = new DB(l.connectionString);
DateTime lastIterationTS = GetPreviousIterationTS(l.id);
ExternalService serv = new ExternalService(l.id);
List<ChangedData> ChangedDataDb = db.GetChangedData(DateTime.Now.AddSeconds((lastIterationTS == DateTime.MinValue) ? -300 : -1 * (DateTime.Now - lastIterationTS).Seconds));
List<Data> ChangedDataService = serv.GetModifiedData();
Action syncDBChanges = new Action(() =>
{
// Изменения в БД
foreach (ChangedData d in ChangedDataDb)
{
try
{
// ...
// analyzing & syncing
}
catch (Exception e)
{
logger.InfoEx("Exception_SyncDatabase", e.ToString());
}
}
}
);
Action syncService = new Action(() =>
{
foreach (Data d in ChangedDataService)
{
try
{
// ...
// analyzing & syncing
}
catch (Exception e)
{
logger.InfoEx("Exception_SyncService", e.ToString());
}
}
});
List<WaitHandle> handles = new List<WaitHandle>();
IAsyncResult ar1 = syncDBChanges.BeginInvoke(syncDBChanges.EndInvoke, null);
IAsyncResult ar2 = syncService.BeginInvoke(syncService.EndInvoke, null);
handles.Add(ar1.AsyncWaitHandle);
handles.Add(ar2.AsyncWaitHandle);
WaitHandle.WaitAll(handles.ToArray(), (int)((Global.config.syncModifiedInterval - 1) * 1000));
SetCurrentIterationTS(l.id);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
logger.InfoEx("Exception_Iteration", e.ToString());
continue;
}
}
logger.InfoEx("end_Iteration", IterationContextParams);
}
);
s1.Stop();
Console.WriteLine("Main iteration done for {0}...", s1.Elapsed);