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);
}