相同方法中的ThreadPool异步线程

| 我有一个关于ThreadPool使用的问题。 在我运行下面的简单代码之后。我得到结果: 编号:6-> A ID:13-> A 编号:6-> 2A ID:12-> A ID:13-> 2A ID:15-> A 编号:6-> 3A ID:12-> 2A ID:14-> A ID:13-> 3A (继续...) 这是我的代码:
static void Main(string[] args)
{
    Program p = new Program();
    p.Start();
    Console.ReadLine();
}

private void Start()
{
    System.Timers.Timer senderTimer;
    senderTimer = new System.Timers.Timer();
    senderTimer.Elapsed += new System.Timers.ElapsedEventHandler(SenderTimer);
    senderTimer.Interval = 500;
    senderTimer.Enabled = true;
}

private void SenderTimer(object Source, ElapsedEventArgs e)
{
    ThreadPool.QueueUserWorkItem(new WaitCallback(Foo));
}

private void Foo(object state)
{
    string[] array = new string[] { \"A\", \"2A\", \"3A\", \"4A\", \"5A\", \"6A\", \"7A\", \"8A\", \"9A\", \"10A\" };

    for (int i = 0; i < array.Length; i++)
    {
        Trace.WriteLine(\"ID : \" + Thread.CurrentThread.GetHashCode() + \" --> \" + array[i]);
        Thread.Sleep(1000); // Here I have a DB Operation, so i make it sleep
    }
}
结果,我需要得到的是多个线程在做同一件事。 这是我必须获得的输出:希望我解释清楚。有没有办法做到这一点? 编号:6-> A ID:13-> 2A 编号:6-> 3A ID:12-> 4A ID:13-> 5A ID:15-> 6A 编号:6-> 7A ID:12-> 8A ID:14-> 9A 编号:13-> 10A 感谢任何帮助。非常感谢。     
已邀请:
如果要强制处理顺序,则使它成为多线程是没有意义的,因为每个线程总会等待上一个线程。 如果要并行执行处理,然后将结果按收到的顺序排列,则可以使用
        string[] array = new string[] { \"A\", \"2A\", \"3A\", \"4A\", \"5A\", \"6A\", \"7A\", \"8A\", \"9A\", \"10A\" };
        var results = array.AsParallel().Select((item, i) =>
        new
        {
            Index = i,
            Result = ProcessItem(item)
        })
        .OrderBy(x => x.Index)
        .Select(i=>i.Result)
        .ToList();
    
您应该具有要在Foo函数外部打印的数字数组。如果在内部,则每个线程都将尝试处理完整列表,但这不是您想要的(据我所知)。 您要创建一个新函数,例如
GetNextItemToProcess
,它将返回数组中尚未处理的下一项。然后,在您的
Foo
函数中,调用类似
lock(this)
{
   string nextItem = GetNextItemToProcess();
   Trace.WriteLine(\"ID : \" + Thread.CurrentThread.GetHashCode() + \" --> \" + nextItem );
}
由于每个线程都需要确保正确捕获下一个项目,因此需要锁定。重要说明:在确保所需功能的同时,锁定整个功能并不适合多线程。使用这种方法,它也可能是串行的。如果可以以任意顺序执行每项工作,则线程化确实会给您带来好处,在这里不是这种情况。如果您确实需要输出“ \\\\\\\\\\\\\\\\\\\\\\,\,\,\“,\”,\“,” \“,” A,2A,3A \“,则最好以串行方式进行。如果可以出现\“ 2A,A,3A \”或随机顺序,并且预期每个项目仅显示一次,则您需要线程化。     

要回复问题请先登录注册