gpt4 book ai didi

multithreading - 多线程会提高 WCF 服务中方法的性能吗?

转载 作者:行者123 更新时间:2023-12-04 06:49:33 26 4
gpt4 key购买 nike

我有一个托管在 IIS6 中的 WCF 服务。该方法的重要部分如下所示:

public MyUser[] GetUsers(string appName, string[] names)
{
List<User> users = new List<User>();
foreach (string user in names)
{
MembershipUser mu = this.ADAMProvider.GetUser(user, false); //Unmanaged call to AzMan
if (mu != null)
{
users.Add(MyUser.CreateFrom(mu);
}
}
return users.ToArray();
}

当使用大量用户名(超过 100 个左右)调用时,此方法的性能非常差。返回可能需要一分多钟。此外,如果此方法被多个客户端同时调用,则会超时。我什至看到它降低了应用程序池。请注意,在循环中正在调用 AzMan。 AzMan 是非托管 COM 组件。

为了提高性能,我正在考虑采用多线程方法。 .NET 4 不是一个选项,因此 Parallel.For 不是一个选项,但在 3.5 中做等效的是。

我的问题是创建一堆线程(然后在返回之前等待所有线程)真的会提高性能吗?在 IIS6 托管的 WCF 服务中这样做有危险吗?

最佳答案

首先,我已经指出 COM 组件可能会出现问题,具体取决于其单元状态。单线程单元对象只能在一个线程中运行。在 STA 对象上会发生一个自动编码操作,该操作会有效地序列化对它的所有调用,因此无论您多么努力地尝试,您可能都无法从中获得任何并行化。即使它是 MTA 对象,如果 GetUser 方法未设计为线程安全的,它也可能存在问题。

但假设这些都不是问题1 我会使用ThreadPool 而不是创建一堆线程来执行此操作。它可能看起来像这样。

public MyUser[] GetUsers(string appName, string[] names) 
{
int count = 1; // Holds the number of pending work items.
var finished = new ManualResetEvent(false); // Used to wait for all work items to complete.
var users = new List<User>();
foreach (string user in names)
{
Interlocked.Increment(ref count); // Indicate that we have another work item.
ThreadPool.QueueUserWorkItem(
(state) =>
{
try
{
MembershipUser mu = this.ADAMProvider.GetUser(user, false);
if (mu != null)
{
lock (users)
{
users.Add(MyUser.CreateFrom(mu);
}
}
}
finally
{
// Signal the event if this is the last work item.
if (Interlocked.Decrement(ref count) == 0) finished.Set();
}
});
}
// Signal the event if this is the last work item.
if (Interlocked.Decrement(ref count) == 0) finished.Set();
// Wait for all work items to complete.
finished.WaitOne();
return users.ToArray();
}

关于我在上面使用的模式的一个令人困惑的事情是它将主线程(排队工作的线程)视为另一个工作项。这就是您在循环末尾看到检查和信号代码的原因。没有它,SetWaitOne 调用之间可能会出现非常微妙的竞争条件。

顺便说一下,我应该指出 TPL 在 .NET 3.5 中作为 Reactive Extensions 的一部分可用。下载。

1我怀疑我提到的两个问题之一会在现实中发挥作用。

关于multithreading - 多线程会提高 WCF 服务中方法的性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4107558/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com