Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何指定处理器关联性?_C#_.net_Vba_Ms Access - Fatal编程技术网

C# 如何指定处理器关联性?

C# 如何指定处理器关联性?,c#,.net,vba,ms-access,C#,.net,Vba,Ms Access,我有一个应用程序在处理多处理器系统时遇到了一些问题。这不是一个我特别喜欢修改的应用程序,如果可能的话,我想避免它。但是,如果有必要的话,我不会修改代码。应用程序是用VBA编写的(因此我倾向于避免接触它) 我们注意到,如果我们使用任务管理器将处理器关联性设置为单个处理器,应用程序似乎运行得非常顺利,只有在未设置处理器关联性时才会表现出不稳定性 我知道我可以使用.NET指定任务的处理器相关性,因此,我有可能编写一个shell应用程序,用于运行具有指定处理器相关性的遗留应用程序,有没有人有过这样的经验

我有一个应用程序在处理多处理器系统时遇到了一些问题。这不是一个我特别喜欢修改的应用程序,如果可能的话,我想避免它。但是,如果有必要的话,我不会修改代码。应用程序是用VBA编写的(因此我倾向于避免接触它)

我们注意到,如果我们使用任务管理器将处理器关联性设置为单个处理器,应用程序似乎运行得非常顺利,只有在未设置处理器关联性时才会表现出不稳定性

我知道我可以使用.NET指定任务的处理器相关性,因此,我有可能编写一个shell应用程序,用于运行具有指定处理器相关性的遗留应用程序,有没有人有过这样的经验,并且可以提出一些想法,来解决我在使用这种方法时可能遇到的难题

另一个问题是:实际上是否有可能修改核心VBA产品以处理其自身的处理器相关性?我从来没有在我的任何应用程序中处理过这个问题,所以(在这个时候)完全超出了我的专业领域


提前感谢

您可以使用Sysinternal以特定处理器关联启动应用程序,例如绑定对CPU 1调用的访问

psexec.exe -a 1 "%ProgramFiles%\Microsoft Office\Office12\access.exe"
回答第二个问题:当您使用access vba标记问题时,我假设您的vba代码是access解决方案。然后,您的VBA代码将在进程中执行,即您必须修改access.exe进程的处理器关联性。无法单独修改VBA引擎的关联性

但是,在指定处理器关联之前,请确保您完全了解其后果。摆弄此设置可能会产生不期望的效果。有关一个好例子,请阅读Raymond Chen的帖子:


一种方法是使用

您为它提供了一种识别应用程序的方法(例如,通过.exe位置),然后它允许您指定一些调整。处理器亲和力就是其中之一。它会创建一个数据库来保存所有的调整


它是每台机器的,因此对于广泛分布的应用程序来说,这不是一个好的解决方案,但是如果这个应用程序只需要在一台机器上运行,那么您就不必更改代码了。

旧线程,但这里有一些VBA。它是有效的,但不是我写的

选项比较数据库
选项显式
将私有函数GetProcessAffinityMask Lib“kernel32.dll”(ByVal hProcess为Long,ByRef dwProcessAffinityMask为Long,ByRef dwSystemAffinityMask为Long)声明为布尔值
将私有函数SetProcessAffinityMask Lib“kernel32.dll”(ByVal hProcess为Long,ByVal dwProcessAffinityMask为Long)声明为布尔值
私有声明函数GetCurrentProcess Lib“kernel32.dll”(长度为
公共函数SetAffinity()
长时间
暗淡的面具像长的一样
将dwSysMask设置为长
hRet=GetProcessAffinityMask(GetCurrentProcess(),dwProcMask,dwSysMask)
'将关联设置为第一个处理器
hRet=SetProcessAffinityMask(GetCurrentProcess(),&H1)
如果hRet为0,则
MsgBox“已成功为此应用程序设置进程关联。”
其他的
MsgBox(“错误:&Err.LastDllError)
如果结束
端函数

我们的IT经理发现这种黑客行为是为了制造一款不能很好地处理多核/多处理器环境的应用程序。I.T.正在测试修改处理器关联是否会稳定应用程序。如果是,那么这将是一个I.T.倡议。我被要求从开发的角度提供输入。另外,请注意,默认情况下,版本号是它用来标识应用程序的项目之一。如果您定期在更新时更改版本号,您可能希望取消选中此项作为标准,否则您的调整将停止用于下一次升级。我很想知道在未设置处理器相关性时,您看到了哪些问题。这些问题是如何表现出来的?@Gary McGill:我们看到的问题(应用程序是为Access 2003编写的,在Access 2007/2010中无法工作)是应用程序崩溃和一般访问不稳定。该应用程序最初是在单CPU/单核机器上编写的,我们现在在更换这些机器时遇到了问题。该应用程序在多CPU和多核机器上有各种不稳定性,但在较旧的机器上仍然可以正常工作。当我们设置处理器亲和力时,不稳定性不再是一个问题。该应用程序正在被重写,但在完成之前,我们将进退两难。您是否在VBA应用程序中使用多个线程?如果将多线程应用程序限制为单个处理器可以提高性能,那么这通常表示存在错误的缓存问题