C# 并行模拟
我有一个带有“ImpersonationOption.Required”的WCF服务。在使用并行性时,模拟似乎无法通过。例如:C# 并行模拟,c#,wcf,impersonation,parallel-extensions,C#,Wcf,Impersonation,Parallel Extensions,我有一个带有“ImpersonationOption.Required”的WCF服务。在使用并行性时,模拟似乎无法通过。例如: Parallel.ForEach(items => results.Add(SystemUtil.WindowsUser.Name) 将返回模拟用户的号码,以及应用程序池用户的号码。模拟可以与并行性一起工作吗 最好的 马克 更新: 这是IIS服务端的实际代码 [OperationBehavior(Impersonation = ImpersonationOpti
Parallel.ForEach(items => results.Add(SystemUtil.WindowsUser.Name)
将返回模拟用户的号码,以及应用程序池用户的号码。模拟可以与并行性一起工作吗
最好的
马克
更新:
这是IIS服务端的实际代码
[OperationBehavior(Impersonation = ImpersonationOption.Required)]
public string[] WhoAmI(int numOfTests)
{
var tests = new List<int>();
for (var i = 0; i < numOfTests; i++)
tests.Add(i);
var results = new ConcurrentBag<string>();
Parallel.ForEach(tests, (test) => results.Add(WindowsIdentity.GetCurrent(false).Name));
return results.ToArray();
}
[操作行为(模拟=模拟选项。必选)]
公共字符串[]WhoAmI(int numOfTests)
{
var测试=新列表();
对于(var i=0;iresults.Add(WindowsIdentity.GetCurrent(false.Name));
返回结果。ToArray();
}
如果我传入numOfTests=10,它将生成10个任务,并返回每个任务的WindowsIdentity名称。我得到的是约70%的“IIS APPPOOL.NET v4.0”和约30%的我
我如何设置它,使我的身份始终进入Parallel.ForEach
谢谢 你需要自己处理。试着这样做:
IntPtr token = WindowsIdentity.GetCurrent().Token;
Parallel.ForEach( Enumerable.Range( 1, 100 ), ( test ) =>
{
using ( WindowsIdentity.Impersonate( token ) )
{
Console.WriteLine( WindowsIdentity.GetCurrent( false ).Name );
}
} );
请发布准确的代码,这没有任何意义。我已使用准确的代码更新了问题。请将其作为每个循环的正常代码重新写入(
foreach(timer in timers){results.Add(windowsintity.GetCurrent(false).Name;}
)你会发现这个问题,你从来没有在循环中使用定时器做过任何事情,所以你只是一遍又一遍地执行相同的代码,当然每次都会得到相同的结果。好吧,这样提问会更好,甚至更有趣。如果它在一天左右没有重新打开,请重新发布。作为解释,我会说线程正在模拟ForEach的一部分,而额外的线程不会模拟。数字10太小,无法获得真正的分发。这很有效——谢谢!我们很幸运,我们将Parallel.ForEach调用包装到了一个扩展方法中,所以我只需在一个位置进行更改。