gpt4 book ai didi

c# - 线程 foreach 循环的正确方法

转载 作者:行者123 更新时间:2023-11-30 20:53:38 26 4
gpt4 key购买 nike

在过去的 30 分钟里,我一直在破解这个问题,试图对一个简单的 foreach 循环进行线程处理,无论我做什么,它都会抛出一些错误(第一次不使用线程框架所以我很可能犯了一些愚蠢的语法错误)

遗憾的是我不能使用 Parallel.For 因为必须保持 .net 3.5 或更低版本...有人可以告诉我正确的方法来做这件事所以我可以回到不想尖叫的状态!!

Sudo 代码

void SomeMethod
{
foreach(Touch Input in Inputlist){
Thread thread = new Thread(new ThreadStart(this.FilterInput(Input)));
thread.Start();
}
}
void FilterInput(Input UnFilteredInput){
....
}

编辑:MonoDevelop 出现以下错误

  1. 表达式表示一个值,其中类型或方法组是预计

  2. 最佳重载方法匹配System.Threading.Thread.Thread(System.Threading.ThreadStart) 有一些无效的参数,

  3. 参数 #1 无法将对象表达式转换为类型系统.Threading.ThreadStart

最佳答案

首先,对于这样的事情,您应该使用更轻量级的线程池而不是完整的线程。 (你也确实犯了一些转换错误,线程池版本使用与 Thread 相同的样式所以你可以看到区别)

void SomeMethod
{
foreach(Touch input in Inputlist){
ThreadPool.QueueUserWorkItem(new WaitCallback(FilterInput), input);
}
}
void FilterInput(object unCastUnFilteredInput){
Touch UnFilteredInput = (Touch)unCastUnFilteredInput;
....
}

但是,我仍然担心每秒创建太多线程,并建议使用某种阻塞来衡量可以创建新线程的速率。

const int MaxConcurrentThreads = 4;

private readonly Semaphore _inputLimiter = new Semaphore(MaxConcurrentThreads,MaxConcurrentThreads);

void SomeMethod
{
foreach(Touch input in Inputlist){
_inputLimiter.WaitOne();
ThreadPool.QueueUserWorkItem(new WaitCallback(FilterInput), input);
}
}
void FilterInput(object unCastUnFilteredInput){
try
{
Touch UnFilteredInput = (Touch)unCastUnFilteredInput;
....
{
finally
{
//use a try-finally so the semaphore still gets released in the event a exception happens in the .... region.
_inputLimiter.Release();
}
}

关于c# - 线程 foreach 循环的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19829306/

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