我正在编写一个可以轻松划分为几个不同部分的程序。简化,它看起来像这样:
Reader
类适用于从特定设备获取数据,Analyzer
类会定期对从设备获取的数据进行计算,Form1
类输出UI(Reader
收集的数据的图形表示和Analyzer
输出的数字当然,我希望这三个类在不同的线程中运行(在不同的核心上)。含义 - Reader
的所有方法都在自己的线程中运行,Analyzer
的所有方法都在自己的线程中运行,Form1
在默认线程中运行。
但是,所有想到的都是使用Thread
或BackgroundWorker
类,而不是在Reader
或Analyzer
上调用一些资源密集型方法而是打电话
BackgroundWorker.RunWorkerAsync()
我想这不是最好的方法,是吗?我宁愿以某种方式在一个单独的线程中创建该类,并将其留在那里,因为它的生命周期,但我只是不知道我该怎么做...我想不出一个合适的搜索查询,因为我我搜索一个时没有找到答案。
编辑:感谢您的评论,我想我理解,问题本身就是假设您可以在“线程”上创建一个类 - 隐含的意思是“此类的任何方法都将在其线程上执行” - 这没有意义,也无法完成。答案 0 :(得分:1)
我认为你走在正确的轨道上。你需要
由Reader
启动的两个帖子Analyzer
和Form1
。它们基本上由大循环组成,直到设置了一个标志stopReader
或stopAnalyzer
:
两个concurrent queues,我们称之为readQueue
和analyzedQueue
。 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
。