C# 循环和线程并行工作

C# 循环和线程并行工作,c#,multithreading,thread-safety,threadpool,C#,Multithreading,Thread Safety,Threadpool,我的情况是: 循环和线程并行工作。。我想停止循环的执行,直到线程完成其功能,当线程状态停止时,此时我想进一步执行循环 for (int pp = 0; pp < LstIop.Count; pp++) { oCntrlImageDisplay = new CntrlImageDisplay(); oCntrlImageEdit = new CntrlImageEdit();

我的情况是: 循环和线程并行工作。。我想停止循环的执行,直到线程完成其功能,当线程状态停止时,此时我想进一步执行循环

            for (int pp = 0; pp < LstIop.Count; pp++)
            {
                oCntrlImageDisplay = new CntrlImageDisplay();
                oCntrlImageEdit = new CntrlImageEdit();
                axAcroPDF1 = new AxAcroPDFLib.AxAcroPDF();
                int pages = ConvertFileIntoBinary(LstIop[pp].Input, oCntrlImageEdit);
                oCntrlImageDisplay.ImgDisplay.Image = LstIop[pp].Output;
                oCntrlImageDisplay.ImgEditor.Image = oCntrlImageDisplay.ImgDisplay.Image;


                if (t1 == null || t1.ThreadState.ToString() == "Stopped")
                {
                    t1 = new Thread(() => convert(pages, LstIop[pp].Input, LstIop[pp].Output, stIop[pp].Temp));
                    t1.SetApartmentState(ApartmentState.STA);
                    t1.IsBackground = true;
                    CheckForIllegalCrossThreadCalls = false;
                    t1.Start();

                }
            }
for(int-pp=0;ppconvert(pages,LstIop[pp].Input,LstIop[pp].Output,stIop[pp].Temp));
t1.SetApartmentState(ApartmentState.STA);
t1.IsBackground=true;
CheckForIllegalCrossThreadCalls=false;
t1.Start();
}
}

要等待线程完成执行,请调用:

t1.join();

正如其他人所说,线程在这里没有任何意义,但是如果你执意要这样做,那么就使用异步。只需使用.Invoke或.begininvoke,后跟.endInvoke即可

例:

使用委托很好,因为您可以指定返回数据和发送参数

    delegate double T2(byte[] array,string text, int num);

    static void Main(string[] args)
    {
        T2 Thread = new T2(Work);

        while (true)
        {
            IAsyncResult result = Thread.BeginInvoke(null, null);

            //OTHER WORK TO DO

            double Returned = Thread.EndInvoke(result);
        }
    }

    static double Work(byte[] array, string text, int num)
    {
        // WORK TO DO
        return(3.4);
    }

如果循环应该等待线程完成,这与仅仅在循环中执行任务有什么不同?那么为什么要在单独的线程中调用代码呢?为什么不直接在循环中调用convert方法呢?如果在当前线程完成之前无法启动下一个线程,那么您的线程就不能并行工作,那么您最好不要费心插入线程。更好的解决方案是创建一个循环,为所有图像启动线程,然后等待它们全部完成后再继续。
CheckForIllegalCrossThreadCalls
基本上不应为false。如果需要修改UI元素,请不要将该任务放在另一个线程中,或者在访问这些项目时将代码封送回UI线程。事实上,您的代码将充满难以调试的竞争条件。我猜您不会只想在t1.Start之后执行t1.Join(),这将使converty在单独的线程中进入循环几乎毫无意义。您最终会编写
t1.Start();t1.Join(),这只会使整个过程有序。没有任何东西是并行的,这已经过时了。OP不仅不太可能想这样做,而且如果有人真的想这样做,那么使用任务会更简单、更强大。正如我所说,这不太可能是他需要采取的方法,即使是这样,也做得不太好。哦,现在您几乎不应该定义自己的委托,您可以使用
Func
和/或
Action
覆盖99%的用例。
    delegate double T2(byte[] array,string text, int num);

    static void Main(string[] args)
    {
        T2 Thread = new T2(Work);

        while (true)
        {
            IAsyncResult result = Thread.BeginInvoke(null, null);

            //OTHER WORK TO DO

            double Returned = Thread.EndInvoke(result);
        }
    }

    static double Work(byte[] array, string text, int num)
    {
        // WORK TO DO
        return(3.4);
    }