Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.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#_Wcf_Impersonation_Parallel Extensions - Fatal编程技术网

C# 并行模拟

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

我有一个带有“ImpersonationOption.Required”的WCF服务。在使用并行性时,模拟似乎无法通过。例如:

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调用包装到了一个扩展方法中,所以我只需在一个位置进行更改。