我有一个带有按钮,计时器和ImageSearch类的C#表单。
此按钮启动6个对象(ImageSearch),它将为我进行一些图像搜索。
这6个对象分别更新主窗体上的图片框。
当我的按钮创建对象并启动计时器时,计时器将执行每个对象抓取功能。
我的问题是他们一次处理一个图像而不是单独处理,即使它们是单独的对象。如何让它们独立运行,制作6个计时器?
我希望所有对象同时运行。
当我的表单开始时,我创建了所有6个对象。
ImageSearch imageSearch1 = new ImageSearch(URL);
ImageSearch imageSearch2 = new ImageSearch(URL);
ImageSearch imageSearch3 = new ImageSearch(URL);
ImageSearch imageSearch4 = new ImageSearch(URL);
ImageSearch imageSearch5 = new ImageSearch(URL);
ImageSearch imageSearch6 = new ImageSearch(URL);
然后我的按钮才启动定时器,启用Timer1到timer6并设置间隔。
Timer1例如:
imageSearch1.Crawl();
答案 0 :(得分:0)
你需要一个计时器?
如何使用Parallel LINQ:
imageSearchers
.AsParallel()
.ForAll(x => x.DoSomeThing());
PLINQ试图为此使用合理的线程。
您还可以使用多个Task
:
Task1 = Task.Factory.StartNew(() => imageSearch1.Search());
Task2 = Task.Factory.StartNew(() => imageSearch2.Search());
Task3 = Task.Factory.StartNew(() => imageSearch3.Search());
Task.WaitAll(new [] { Task1, Task2, Task3, ...})
注意:如果你不想,你不需要等待“here”,但是在应用程序的某个地方你应该跟踪异步工作,以便你可以在关机时取消/等待它结束/处理例外......
答案 1 :(得分:0)
我认为你最好使用新的Task API,比如:
var tasks = new List<Task>();
for( var i = 0; i < 6; i++ )
tasks.Add( Task.Run( () => ImageSearch.Search( forImage ) ) );
Tasks.WaitAll( tasks.ToArray() );
这样,您可以卸载所有计划并等待框架,并专注于您的业务逻辑。