【问题标题】:Need guidance on how to write this as a multi-threaded app需要有关如何将其编写为多线程应用程序的指导
【发布时间】:2010-12-29 14:40:41
【问题描述】:

我有一个正在开发的应用程序,这就是它目前的样子。 我想知道我是否可以得到一些帮助来提高效率。 也在寻求使用任务并行库(如果它有帮助的话)。 现在对事物的设计方式没有任何限制,这意味着我可以完全重新设计应用程序的任何部分。

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

    }
}

感谢您的帮助

【问题讨论】:

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


    【解决方案1】:

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

    对于一些非常笼统的建议,多线程设计适用于三种类型的问题:

    1. 您不希望长时间运行的任务阻塞调用线程。这可能更适用于您不想阻塞主 GUI 线程的 GUI 应用程序,因此应用程序可以保持响应。
    2. 算法就是所谓的“尴尬并行”,意思是可以细分数据,跨多核并行运行算法。
    3. 与本地或远程其他进程的通信。其他进程当然是其他线程。

    以上内容有点过于简单化了,但重点是,请确保您解决的是正确的问题,而不是强迫您的问题进入先入为主的解决方案。在决定使用多线程设计时需要考虑很多因素。自动化测试将变得更加困难。您的设计是否可以通过执行的正确性(无崩溃/挂起/数据损坏)以及您对特定应用程序的性能定义进行维护?当然,TPL 使多线程设计更容易,但它肯定不会完全消除这些成本。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-25
      • 2015-11-12
      相关资源
      最近更新 更多