gpt4 book ai didi

c# - 多任务处理多个类实例

转载 作者:行者123 更新时间:2023-11-30 22:10:20 24 4
gpt4 key购买 nike

今天,我决定尝试多任务,看看与多线程相比,我是否能获得性能提升。我特别感兴趣,因为我正在寻找一种简单的方法来返回值并使用 WaitAll 或 WaitAny 等功能。我的问题是我做错了什么,多任务多实例的最佳方式是什么?

这是我使用线程的旧代码。 (工作)

Thread[] threads = new Thread[5];
ScrapeFollowersIds[] scrapeClass = new ScrapeFollowersIds[5];
for (int i = 0; i < 5; i++)
{
scrapeClass[i] = new ScrapeFollowersIds();
threads[i] = new Thread(() => scrapeClass[i].ScrapeFollowers(cookie,proxy);
threads[i].Start();
}

这是我的新解决方案。

每个任务都显示 Status = Faulted, Method {null}, Result not yet computed查看异常我得到内部异常:索引超出了数组的范围

Task<string>[] scrapeFollowers = new Task<string>[5];
ScrapeFollowersIds[] scrapeClass = new ScrapeFollowersIds[5];
for (int i = 0; i < 5; i++)
{
scrapeClass[i] = new ScrapeFollowersIds();
scrapeFollowers[i] = Task<string>.Factory.StartNew(() =>
scrapeClass[i].ScrapeFollowers(cookie, proxy);
}

我调用的方法是这样的

try
{
//Dosomething
return someString;
}
catch
{
return "";
}

最佳答案

您正在关闭循环变量 i

这个bug实际上存在于两个程序中。

由于定义要在另一个线程中运行的代码的 lambda 在 i 上关闭,并且 i 最终(可能)在代码实际运行之前被主线程更改.在循环内获取循环变量的副本并关闭那个

话虽如此,您可以通过不创建所有任务都需要手动访问的外部数组来完全使用 TPL 来避免整个情况。这不是一种非常面向 TPL 的做事方式。而是让每个任务独立创建其结果,然后聚合结果:

var tasks = Enumerable.Range(0, 5)
.Select(_ => Task.Run(() => CreateScrapeFollower(cookie, proxy)));

var results = Task.WhenAll(tasks);

关于c# - 多任务处理多个类实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20893320/

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