【问题标题】:How do I get multiple objects to process things at the same time如何让多个对象同时处理事物
【发布时间】:2014-02-27 04:35:12
【问题描述】:

我有一个带有按钮、计时器和 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 被启用并设置间隔。

以定时器 1 为例:

imageSearch1.Crawl();

【问题讨论】:

  • 没有代码很难弄清楚你的计时器在做什么,无论如何,计时器似乎不是解决问题的合理方法。此外,如果图像来自网络,则图像加载应该是异步的,即包装在任务或线程中。
  • 一些代码会有所帮助。
  • 我猜你将不得不使用多个线程来达到你的目的。

标签: c#


【解决方案1】:

你需要一个计时器来做什么?

改用并行 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, ...})

注意:如果你不想,你不需要在“这里”等待,但是你应该在你的应用程序的某个地方跟踪异步工作,这样你就可以在关机时取消它/等待它结束/ 处理异常...

【讨论】:

    【解决方案2】:

    我认为您最好使用新的 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() );
    

    这样,您可以将所有的调度和等待转移到框架上,并专注于您的业务逻辑。

    【讨论】:

      猜你喜欢
      • 2016-10-02
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多