我有一个 eBay 帐户。为了轻松更新我的产品,我用 C# 创建了一个 Windows 服务。它等待(通过FileSystemWatcher
)一个 xml 文件,一旦文件出现,服务就会读取它并通过其 API 向 eBay 服务器发送请求。一个文件可能包含大约 1000-3000 行。
以前我曾经创建12 个线程以使其更快。我不知道为什么我选择了12 个线程,我认为这已经足够了:不要太多也不要太少。
所以这是一个我以前看起来的方法(有点脏,12应该是一个常数)
private static void UpdateAsync(IEnumerable<ProductInfo> products)
{
ProductInfo[] productsInfo = items.ToArray();
Thread[] threads = new Thread[12];
bool sendPartialy = productsInfo .Length > 12;
int delta = 0;
for (int i = 0; i < productsInfo.Length; i++)
{
if (sendPartialy )
{
if (i != 0 && i % 12 == 0)
{
WaitForExecutedThreads(threads);
delta = 12 * (i / 12);
}
}
ProductInfo product = ProductInfo[i];
threads[i - delta] = new Thread(_ => product.UpdateItem(context));
threads[i - delta].Start();
}
WaitForExecutedThreads(threads);
}
然后他们告诉我,因为只有一个网络接口,所以不需要使用线程:允许同时执行 12 个 https 请求是很窄的,因此,每个线程都将等待另一个线程。
这就是为什么我决定根本不使用多线程,而只使用这样的简单请求:
var itemInfoLights = new List<ItemInfoLight>();
foreach (var p in productsInfo )
{
p.UpdateItem(context);
}
我知道,单独发送所有请求太糟糕了,因为每个请求都有自己的标头等……这效率不高。
那么,这样做的正确方法是什么?