2010-12-29 5 views
2

私が働いているアプリがありますが、現在の状況は次のとおりです。 私はこれをもう少し効率的にする助けを得ることができるかどうか疑問に思っていました。 タスクパラレルライブラリーも利用したいと思っていました。 現在の設計方法には制限がありません。つまり、アプリの一部を完全に再設計できます。これをマルチスレッドアプリケーションとして書く方法のガイダンスが必要です

class Program 
{ 
    static void Main(string[] args) 
    { 
     IList<ISystem> systems = GetSystems(); 
     if (systems.Where(s => s.Import = true).Count() == 0) 
      return; 

     var export = new Export(); 
     // Import & Export People 
     exportData.LoadPeople(); 
     foreach(var system in systems) 
      foreach(var person in export.People) 
       system.Push(person); 

     export.LoadLocations(); 

     foreach(var system in systems) 
      foreach(var location in export.Locations) 
       system.Push(location); 

     export.LoadOtherData(); 

     foreach(var system in systems) 
      system = system as IDifferentSystem; 
      if (system == null) continue; 
      foreach(var data in export.OtherData) 
       system.Push(data); 

    } 
} 

任意のヘルプ

答えて

2

のおかげでそれはすべてあなたが「効率的」によって何を意味するかに依存し、どのような問題、あなたはマルチスレッド設計を維持するための費用対解決しようとしています。あなたは長時間実行タスクは、呼び出し元のスレッドをブロックしたくない

  1. いくつかの非常に一般的なアドバイスについては

    、マルチスレッド設計が適切である問題の3つのタイプがあります。これはおそらく、主GUIスレッドをブロックしたくないGUIアプリケーションに適用可能なので、アプリケーションは応答性を保つことができます。

  2. このアルゴリズムは、いわゆる「恥ずかしがっている並列」です。つまり、データを細分化し、アルゴリズムを複数のコアにわたって並列に実行することができます。
  3. ローカルまたはリモートの他のプロセスとの通信。他のプロセスは、もちろん他のスレッドです。

上記はちょっと簡略化されていますが、問題を先取りした解決策に強制するのではなく、正しい問題を解決していることを確認してください。マルチスレッド設計の使用を決定する際に考慮すべき多くの要素。自動テストは難しくなります。実行の正確さ(クラッシュ/ハング/データ破損なし)と特定のアプリケーションのパフォーマンスの定義で、あなたの設計を維持することができますか?もちろん、TPLはマルチスレッド設計を容易にしますが、これらのコストを完全に排除するわけではありません。

代替案を常に検討してください。たとえば、上記の#1は、非同期のものを使用して行うこともできます。おそらく入出力コールバックは後で呼び出しスレッドで実行されます(これは内部的にはマルチスレッドですが、気にする必要はありません)。これはまだシングルスレッド設計であり、ロックを心配する必要はありません。また、#2については、より効率的なアルゴリズムおよび/またはデータ構造レイアウトを使用して性能を達成することも可能である。

関連する問題