.net - 需要有关如何将其编写为多线程应用程序的指南

标签 .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);

    }
}

谢谢你的帮助

最佳答案

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

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

  • 您不希望长时间运行的任务来阻塞调用线程。这可能更适用于您不想阻塞主GUI线程的GUI应用程序,因此该应用程序可以保持响应状态。
  • 该算法是所谓的“令人尴尬的并行”,这意味着您可以分割数据并跨多个内核并行运行该算法。
  • 与其他本地或远程进程的通信。其他进程当然是其他线程。

  • 上面的操作有点过分简化了,但要点是,请确保您正在解决正确的问题,而不是将问题强加到预先设想的解决方案中。决定使用多线程设计时需要考虑许多因素。自动化测试将变得更加困难。您的设计是否可以通过执行的正确性(没有崩溃/挂起/数据损坏)以及您对特定应用程序的性能定义进行维护?当然,TPL使多线程设计更加容易,但绝对不能完全消除这些成本。

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

    关于.net - 需要有关如何将其编写为多线程应用程序的指南,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4555022/

    相关文章:

    c# - "Selecting"或 "Wrapping"一个 IQueryable 以便它仍然可查询

    c# - System.IO.FileShare 有限制吗?

    c# - 如何验证 UPC 或 EAN 代码?

    c++ - 如何在不使用mutex、semorphore、spinLock、futex的情况下实现线程同步?

    java - 当 main 方法中声明 2 个对象时,代码会同时编译吗?

    c++ - Linux VM(重型多线程应用程序)的性能改进

    c# - 让 Parallel.ForEach 等待直到插槽打开才开始工作

    .net - 在测试期间返回模拟并在正常运行期间返回实际实现的类实例

    c# - 用于设置对象属性的 Linq 表达式树是什么?

    garbage-collection - 后台垃圾收集和并发垃圾收集之间的区别?