如何在单独的线程中运行(创建?)类?

时间:2014-01-15 07:30:40

标签: c# multithreading

我正在编写一个可以轻松划分为几个不同部分的程序。简化,它看起来像这样:

  • Reader类适用于从特定设备获取数据,
  • Analyzer类会定期对从设备获取的数据进行计算,
  • Form1类输出UI(Reader收集的数据的图形表示和Analyzer输出的数字

当然,我希望这三个类在不同的线程中运行(在不同的核心上)。含义 - Reader的所有方法都在自己的线程中运行,Analyzer的所有方法都在自己的线程中运行,Form1在默认线程中运行。

但是,所有想到的都是使用ThreadBackgroundWorker类,而不是在ReaderAnalyzer上调用一些资源密集型方法而是打电话

BackgroundWorker.RunWorkerAsync()

我想这不是最好的方法,是吗?我宁愿以某种方式在一个单独的线程中创建该类,并将其留在那里,因为它的生命周期,但我只是不知道我该怎么做...我想不出一个合适的搜索查询,因为我我搜索一个时没有找到答案。

编辑:感谢您的评论,我想我理解,问题本身就是假设您可以在“线程”上创建一个类 - 隐含的意思是“此类的任何方法都将在其线程上执行” - 这没有意义,也无法完成。

1 个答案:

答案 0 :(得分:1)

我认为你走在正确的轨道上。你需要

  • Reader启动的两个帖子AnalyzerForm1。它们基本上由大循环组成,直到设置了一个标志stopReaderstopAnalyzer

  • 两个concurrent queues,我们称之为readQueueanalyzedQueue。 Reader会将内容放入readQueue,Analyzer会从readQueue读取并写入analyzedQueue,而Form1将从analyzedQueue读取。

    void runReader()
    {
        while (!stopReader)
        {
            var data = ...; // read data from device
            readQueue.Enqueue(data);
        } 
    }
    
    void runAnalyzer()
    {
        while (!stopAnalyzer)
        {
            Data data;
            if (readQueue.TryDequeue(out data))
            {
                var result = ...; // analyze data
                analyzedQueue.Enqueue(result);
            }
            else
            {
                Thread.Sleep(...); // wait a while
            } 
        }
    }
    
  • 您可以使用BlockingCollection代替Thread.Sleep,等待新数据项可用。在这种情况下,您可能希望使用CancellationToken代替stopAnalyzer的布尔值,以便在停止算法时可以中断BlockingCollection.Take