什么时候使用多线程?

2024-01-03

什么时候在应用程序中使用线程?例如,在简单的 CRUD 操作中,使用 smtp,如果服务器面临带宽问题,则调用可能需要一些时间的 Web 服务等。

老实说,我不知道如何确定是否需要使用线程(我知道一定是当我们期望某个操作需要一些时间才能完成时)。

这可能是一个“菜鸟”问题,但如果您与我分享您在线程方面的经验,那就太好了。

Thanks


我在您的问题中添加了 C# 和 .NET 标签,因为您在标题中提到了 C#。如果这不准确,请随意删除标签。

多线程有不同的风格。例如,有带有回调函数的异步操作。 .NET 4 引入了并行 Linq 库。您将使用的多线程风格,或者是否使用任何多线程风格,取决于您想要完成的任务。

并行执行(例如并行 Linq 通常尝试执行的操作)利用多个处理器核心来执行不需要等待彼此数据的指令。 Linq 之外的此类算法有很多来源,例如this http://www.cs.cmu.edu/~scandal/nesl/algorithms.html。但是,并行执行可能无法满足您的需要,或者它不适合您的应用程序。

更传统的多线程利用 .NET 库(在本例中)内的线程,如System.Thread。请记住,在线程上启动进程会产生一些开销,因此仅当这样做的优点超过此开销时才使用线程。一般来说,只有当线程下运行的任务有很长的间隙(处理器可以在其中执行其他操作)时,您才需要使用这种类型的单处理器多线程。例如,来自硬盘(以及因此来自使用硬盘的数据库系统)的 I/O 比内存访问慢许多数量级。作为另一个例子,网络访问也可能很慢。多线程可以允许另一个进程在等待这些缓慢(与处理器相比)操作完成的同时运行。

我使用传统多线程的另一个例子是在会话中第一次访问特定 ASP.NET 页面时缓存一些值。我启动一个线程,以便用户在与页面交互之前不必等待缓存完成。我还规范了在用户请求另一个页面之前缓存未完成时的行为,这样,如果缓存未完成,也不是问题。它只是使一些以前太慢的进一步请求变得更快。

还要考虑多线程对应用程序的可维护性造成的成本。例如,线程应用程序可能更难调试。

我希望这至少能在一定程度上回答你的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么时候使用多线程? 的相关文章

  • SOAP Web 服务的命名空间是否区分大小写?

    我尝试部署一个 Web 服务 并将其更改为一台机器 当我测试其中一个 Web 方法时 我收到一条错误消息 服务器无法识别 HTTP 标头 Soapaction 的值 我做了一些搜索问题 当命名空间存在差异时 似乎有时会发生该错误 我查看了我
  • 通过 Microsoft Graph 从 Azure AD 获取组中的用户

    我正在通过 Microsoft Graph 从 AzureAD 请求用户列表 我取回了 User 对象 但它们的 MemberOf 属性始终为 null 我认为我可以使用 Expand 来专门请求该属性 虽然它不会导致错误 但它也不会填充该
  • 通过 WCF 提供类对象的数组或列表

    任何提供自定义类对象列表或数组的 WCF 客户端服务器示例都会对我有所帮助 但这是我到目前为止所得到的 这是我想提供的班级系统 namespace NEN Server FS Serializable public class XFS pr
  • Serilog 与 Autofac

    我有一个记录器包装器 我想使用以下配置将 serilog 注入其中 var logger new LoggerConfiguration WriteTo RollingFile AppDomain CurrentDomain GetData
  • 在 C# 中将 Exe 文件作为嵌入式资源运行

    我有一个第 3 方 EXE 我只需要从我的 C 应用程序运行它 我的主要目标是对我的 C 文件中的第 3 方可执行文件进行版权保护 有没有更好的方法来做到这一点 我怎样才能做到这一点 首先将嵌入的可执行文件作为资源文件添加到您现有的资源文件
  • 保存到会话状态的 DataTable 丢失事件处理程序

    我有一个来自强类型数据集的数据表 该数据集在 TableNewRow 事件上有一个事件处理程序 用于初始化一些日期字段 当我将此表保存到会话状态时 事件处理程序会正常触发 直到表被序列化 在后续请求中 当我从会话状态检索表时 事件处理程序不
  • 图像的 EMGU/OpenCV FFT 未产生预期结果

    我正在尝试使用 EMGU 可视化图像的 FFT 这是我正在处理的图像 这是预期的结果 Here s what I get 这是我的代码 Image
  • 如何将外部文件添加到应用程序文件(clickonce / .NET)

    我在用着 发布 vs2008 中的选项 我很高兴它的工作原理 现在我想添加 2 个外部 exe 文件到已安装的包中我注意到按钮 应用程序文件 在发布选项卡上 但似乎不允许手动添加新文件 我已经玩过这个并找到了存档的方法 1 将EXE文件作为
  • Tulpep PopupNotifier 无法与计时器一起使用

    using System using System Data SQLite using System Drawing using System Timers using System Windows Forms using Tulpep N
  • ElementReference 对 Blazor 中条件创建的元素的引用

    我正在尝试将焦点设置为有条件呈现的输入控件 我正在设置ElementReference但它的 id 和 context 都是空的
  • WebProxy 错误:需要代理身份验证

    我使用以下代码从互联网获取html数据 WebProxy p new WebProxy localproxyIP 8080 true p Credentials new NetworkCredential domain user passw
  • WCF Xml 与二进制序列化的优缺点

    我知道如果我将二进制序列化与 WCF 一起使用 我就会失去互操作性 如果我愿意接受这一点 我想知道使用二进制比 Xml 是否有效率优势 如果还有我上面没有提到的其他优点和缺点 是的 可能是一个大事件 XML 序列化数据比二进制数据要大 使用
  • 使用日期时间作为文件名并随后解析文件名?

    我正在将文件写入硬盘 文件名是这样构建的 String Format 0 yyyy MM dd hh mm ss txt DateTime Now 例如 文件名是 2010 09 20 09 47 04 txt 现在我想在下拉列表中显示这些
  • 使用signinmanager成功登录后,用户仍然显示为已注销?

    我已将 Asp Net 身份框架添加到从前端调用的 WebAPI 中 注册帐户后 并看到它在数据库中正确显示 我使用该用户的用户名和密码登录 结果成功 但根据登录管理器 用户未登录 我尝试使用 cookie 身份验证使用此示例 https
  • 对于相同的数据库对象,实体框架对象引用是否相同

    如果我从不同位置查询 逻辑上 在数据库中 相同的对象 实体框架是否返回相同的对象引用 例如 我查询了名为 Joe Black 的客户 并假设现在我知道数据库中只有一个 Joe Black Customer c select blabla w
  • 为什么%c前面需要加空格? [复制]

    这个问题在这里已经有答案了 下面的代码一编译就给出了奇怪的o p main char name 3 float price 3 int pages 3 i printf nEnter names prices and no of pages
  • Caliburn.Micro 事件聚合器

    如果这是一个非常愚蠢的问题 请道歉 但我刚刚开始使用 caliburn micro 我正在努力获取 eventAggregator 似乎没有任何内容订阅 我不确定问题是出在视图模型还是引导程序上 这是视图模型 class MainWindo
  • 按下按钮时更改几何绘图画笔的颜色

    我创建了一个按钮模板 有一个图像和一个标签 图像的来源位于 ResourceDictionary Pictures 中 图片的来源是具有白色画笔颜色的 DrawingImage
  • 为什么 Windows 只允许一个应用程序访问网络摄像头? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我一直在尝试用 C 制作一个示例网络摄像头应用程序 我发现该应用程序无法同时运行 Skype 或 Oovoo 或任何其他应用程序运行 反之亦然 为什么
  • 如何在 Ubuntu x64 中使用 ptrace 插入 int3?

    我正在努力追随本指南 http eli thegreenplace net 2011 01 27 how debuggers work part 2 breakpoints 通过设置断点达到相同的结果 唯一的区别是我在 x64 系统上 所以

随机推荐

  • psycopg2.OperationalError:致命:不支持的前端协议 1234.5679:服务器支持 2.0 到 3.0

    我正在使用 Macbook 当连接本地主机数据库 Mac 上的 PostgreSQL 时 Psycopg2 运行良好 当我尝试在 Windows10 上连接 PostgreSQL 数据库时出现错误 以下代码是我用于连接的代码 主机只是win
  • Javafx 点击一个圆圈并获取它的参考

    我在舞台上有一组节点 圆圈 我希望能够单击其中一个并 选择它 只需获取对它的引用 以便我可以移动它 更改颜色等 Pane root new Pane root getChildren addAll an array of Circle ob
  • 带有 ToggleButtons JavaFX 的 ToggleGroup

    如何取消全部选择ToggleButtons in a ToggleGroup在 JavaFX 中 似乎没有一个clearSelection 类似于 Swing 中的功能 你可以做 toggleGroup selectToggle null
  • 拆分有 2 个相似单词的句子

    我需要将句子中的单词分开 但这里有一些问题 word list1 lt c rose location criminal lotus check sing single 如果你看上面的代码 sing 和 single 是我列表中的两个词 现
  • 詹金斯 - 让代理等待其他代理完成

    我是詹金斯的新手 我正在尝试设置一个将使用很少构建执行器的项目 流程如下 两个构建执行器webservice标签返回其 IP 地址并等待第三个构建执行器完成其工作 第三个构建执行器tester标签收集这些 IP 地址并执行一些长时间运行的作
  • Laravel 5.1 - 调用未定义的方法 Illuminate\View\Compilers\BladeCompiler::createPlainMatcher()

    尝试将我的项目从 L5 升级到 L5 1 但不兼容 调用未定义的方法 Illuminate View Compilers BladeCompiler createPlainMatcher 这是导致异常的代码 Blade extend fun
  • Objective-C 整数运算

    我正在尝试在 iPhone 应用程序中计算一些数字 int i 12 int o 60 i 50 1000 在本例中 我希望 o 为 100 即毫秒 但如 NSLog d o 显示的那样 它等于 0 这也等于 0 int o 60 i 50
  • nuget pack [someProject.csproj] 不允许我更改标题或描述

    我知道如果我在包中指定 nuspec 我可以更改作者和描述 即nuget pack someSpec nuspec 但我希望我的项目成为 事实的唯一来源 不幸的是 我似乎无法通过命令行开关更改标题 描述 作者 我想这会起作用 nuget p
  • 为什么单击按钮时对象不移动?

    单击按钮时对象不会移动 为什么会这样呢 function animate var object document getElementById object style var x 100 object left x px object p
  • .php 文件的字符编码错误

    为 MarkersController php 创建了一条返回 json 的路线 但是当我导航到该路线时 出现以下错误 HTML 文档的字符编码未声明 如果文档包含 US ASCII 范围之外的字符 则在某些浏览器配置中 该文档将呈现为乱码
  • 使用 RegExp 匹配括号数字然后递增它

    我一直在尝试找到一种方法来匹配 Javascript 字符串中的数字 该数字在字符串末尾用括号括起来 然后递增它 假设我有一个字符串 var name Item Name 4 我需要一个 RegExp 来匹配 4 部分 然后我需要增加 4
  • 如何在angularjs中重新定义模块?

    我希望我可以在引导后将一个模块附加到主模块 我发现这个问题 https github com angular angular js issues 3881 https github com angular angular js issues
  • p:commandButton 渲染属性在 ajax 更新后不起作用 (Primefaces 3.5)

    我多次收到我的代码 但没有发现有关它的问题 我对 p commandButton 呈现的属性有疑问 即使 getter 方法返回 false p commandButton 也始终显示 这是在 ajax 更新后发生的 我有一个带有 p aj
  • 如何在 Rust 中对字符串进行大小写折叠?

    我正在编写一个简单的全文搜索库 需要大小写折叠来检查两个单词是否相等 对于此用例 现有的 to lowercase https doc rust lang org std primitive str html method to lower
  • 将 Visual Studio 2010 Professional 连接到 TFS

    是否可以将 Visual Studio 2010 专业版连接到 TFS Codeplex 上托管的项目 这表明它不包含在专业版中 http www microsoft com visualstudio en us products http
  • 如何使用 ionic-cli 通过 Crosswalk lite 构建 android?

    当我使用 Crosswalk 编译 APK 时 ionic browser add crosswalk ionic build android 大小太大 20 MB 我认为使用 crosswalk lite 会减少编译后的 APK 的大小
  • 使用 AsyncTask 在后台服务中添加 Android 进度对话框,出现致命异常

    我正在打电话异步任务从预定服务每 10 分钟运行一次 运行服务时 进度对话框从以下位置获取异常预执行 ERROR FATAL EXCEPTION main android view WindowManager BadTokenExcepti
  • C# - 比较两个 CSV 文件并给出输出

    需要一些帮助 我有两个信息源 并且这些信息由不同的程序导出到两个不同的 CSV 文件 它们应该包含相同的信息 但这正是需要检查的内容 因此我想做的事情如下 从两个文件中获取信息 Compare 输出任何差异以及差异所在的文件 例如文件 A
  • 使用 cypress 上传/导入 Excel 文件

    I ve a UI similar to 我需要将已放置在固定文件夹中的 xlsx 文件上传到应用程序中 有什么建议如何使用 cypress 来做到这一点吗 这是我发现的解决方案 安装 cypress 文件上传 npm install sa
  • 什么时候使用多线程?

    什么时候在应用程序中使用线程 例如 在简单的 CRUD 操作中 使用 smtp 如果服务器面临带宽问题 则调用可能需要一些时间的 Web 服务等 老实说 我不知道如何确定是否需要使用线程 我知道一定是当我们期望某个操作需要一些时间才能完成时