如何让多个对象同时处理事物

时间:2014-02-26 07:31:56

标签: c#

我有一个带有按钮,计时器和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();

2 个答案:

答案 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() );

这样,您可以卸载所有计划并等待框架,并专注于您的业务逻辑。