gpt4 book ai didi

即发即弃的 C# 改进

转载 作者:行者123 更新时间:2023-11-30 21:21:49 30 4
gpt4 key购买 nike

问候

我有一个程序创建一个类的多个实例,在所有实例上运行相同的长时间运行的 Update 方法并等待完成。我从 this question 开始关注 Kev 的方法将更新添加到 ThreadPool.QueueUserWorkItem

在主程序中,我睡了几分钟,然后检查最后一个子项中的 bool 值以查看是否完成

while(!child[child.Length-1].isFinished) {
Thread.Sleep(...);
}

此解决方案按我想要的方式工作,但有更好的方法吗?既针对独立实例,也检查是否所有工作都已完成。

谢谢

更新:不需要锁定。每个不同的实例都有不同的 web 服务 url,它们从中请求,并对响应执行类似的工作。他们都在做自己的事情。

最佳答案

如果您知道将执行的操作数,请使用倒计时和事件:

Activity[] activities = GetActivities();
int remaining = activities.Length;
using (ManualResetEvent finishedEvent = new ManualResetEvent(false))
{
foreach (Activity activity in activities)
{
ThreadPool.QueueUserWorkItem(s =>
{
activity.Run();
if (Interlocked.Decrement(ref remaining) == 0)
finishedEvent.Set();
});
}
finishedEvent.WaitOne();
}

不要轮询是否完成。 .NET Framework(以及一般的 Windows 操作系统)有许多线程原语,专门设计用于防止自旋锁的需要,并且带有 Sleep 的轮询循环实际上只是一个缓慢的自旋锁。

关于即发即弃的 C# 改进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2553895/

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