需要有关如何将其编写为多线程应用程序的指导

时间:2010-12-29 14:40:42

标签: .net multithreading .net-4.0 task-parallel-library

我有一个应用程序,我正在努力,这是它目前的样子。 我想知道我是否能得到一些帮助使这更有效率。 正在寻找使用任务并行库(也就是说它会有所帮助)。 对现在的设计方式没有任何限制,这意味着我可以完全重新设计应用程序的任何部分。

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);

    }
}

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

这完全取决于“高效”的含义,以及您要解决的问题与维护多线程设计的成本。

对于一些非常一般的建议,有三种类型的问题需要多线程设计:

  1. 您不希望长时间运行的任务阻止调用线程。这可能更适用于您不想阻止主GUI线程的GUI应用程序,因此应用程序可以保持响应。
  2. 该算法就是所谓的“令人尴尬的并行”,这意味着您可以细分数据并在多个核心上并行运行算法。
  3. 与本地或远程其他进程通信。其他流程当然是其他线程。
  4. 上面的内容有点过于简单,但重点是,确保您正在解决正确的问题,而不是将您的问题强制转换为先入为主的解决方案。决定使用多线程设计时需要考虑的因素很多。自动化测试将变得更加困难。您的设计是否可以正确执行(没有崩溃/挂起/数据损坏)以及您对特定应用程序的性能定义?当然,TPL使多线程设计更容易,但它绝对不会完全消除这些成本。

    始终考虑替代方案。例如,上面的#1也可以使用异步的东西来完成,稍后可能会在你的调用线程上运行I / O回调(即使这是内部多线程的,但你不需要关心它)。这仍然是单线程设计,无需担心锁。同样对于#2,可以使用更有效的算法和/或数据结构布局来实现性能。