4

问题:

有没有办法强制任务并行库同时运行多个任务?即使这意味着通过在每个核心上添加所有上下文切换来使整个过程运行得更慢?

背景:

我对多线程相当陌生,所以我可以使用一些帮助。我最初的研究结果并不多,但我也怀疑我是否知道要搜索什么。也许在多线程方面更有经验的人可以帮助我更好地理解 TPL 和/或找到更好的解决方案。

我们公司正计划在所有用户的机器上部署一个软件,每天几次连接到中央服务器,并将一些文件和MS Access数据同步回用户的机器。我们想先对这个概念进行负载测试,看看 Access DB 如何支持大量同时连接。

我的任务是编写一个 .NET 应用程序,其行为类似于客户端应用程序(与网络位置连接和同步),但同时在多个线程上执行此操作。

我已经熟悉了任务并行库 (TPL),因为这似乎是处理多线程的最佳(最新)方法,并且可以轻松地从每个线程获取返回值。但是,据我了解,TPL 决定如何运行每个“任务”以尽可能快地执行,在可用内核之间分配工作。因此,假设我想在 2 核机器上运行 30 个同步作业……TPL 将在每个核心上按顺序运行 15 个。这意味着我的负载测试只会同时使用最多 2 个连接来访问 Access DB。我想通过大量同时连接来访问数据库。

4

2 回答 2

2

您可以通过指定来强制 TPL 执行此操作TaskOptions.LongRunning。根据 Reflector(但不是根据文档),这总是会创建一个新线程。我考虑依靠这种安全的生产用途。

正常任务不会做,因为它们不保证执行。设置 MinThreads 是一个可怕的解决方案(用于生产),因为您正在更改进程全局设置以解决本地问题。而且,你不能保证成功。

当然,你也可以启动线程。由于错误处理,任务更方便。在这个用例中使用线程没有错。

于 2012-08-18T15:49:57.740 回答
1

根据您的评论,我认为您应该首先重新考虑使用 Access。一旦数据库增长到一定大小,它就不能很好地扩展并且会出现问题。特别是如果这只是通过网络上的某些文件共享提供的。

您可以尝试模拟单台机器的负载,但我认为这不能很好地代表您要完成的工作。

您是否考虑过使用SQL Server Express?它基本上是成熟 SQL Server 的失谐版本,可能更适合您的需求。

于 2012-08-18T15:12:13.177 回答