【发布时间】:2014-11-18 18:10:10
【问题描述】:
我正在构建一个处理库来处理来自传感器的测量数据。根据传感器应用,数据可能会以不同的方式处理。根据处理类型,处理的输出可能包含 1、2 或 3 个输出值。
我创建了几个enum 和interface。这些是关键类型:
public enum ProcessingType
{
Default = 0,
Type1 = 1,
Type2 = 2
}
public interface IProcessItem
{
ProcessingType GetProcessingType();
}
public interface IProcessInputs
{
string GetID();
float GetTemperature();
IEnumerable<byte> GetProcessData();
}
我基本上是在设计一个必须由另一个应用程序记录和实现的 API。我的进程库将有一个由单例 (like the Multithreaded Singleton example here) 管理的单线程处理队列 (like here)。
使用这个库的应用程序为每个与传感器的连接启动一个新线程;在连接结束时,它会将检索到的数据放入一个对象中,将其传递给我的处理队列,然后终止通信线程。在终止通信之前,应用程序不需要等待处理器完成。线。
单例和队列将接受IProcessItem的:
//Singleton
public sealed class SignalProcessor
{
//...
public static SignalProcessor Processor
{
get
{
//...
lock (syncRoot)
{
processor = new SignalProcessor();
}
return processor;
}
}
public void Process(IProcessItem item)
{
processQueue.Enqueue(item);
}
}
//Queue
internal sealed class ProcessQueue : IDisposable
{
//...
public void Enqueue(IProcessItem item)
{
//add to async queue
}
}
//Usage
var po = new ProcessObject();
SignalProcessor.Processor.Process(po);
//...complete and kill thread
从应用程序传递的具体对象应该具有向测量数据处理器提供请求数据所需的一切,然后将结果保存回某种持久存储中。
为输入创建界面很容易,因为它们都是相同的。但是,我无法弄清楚如何处理输出。我已经开始为输出类型创建接口:
public interface IProcessOutput1
{
float Level1 { get; set; }
SaveData();
}
public interface IProcessOutput2
{
float Level1 { get; set; }
float Level2 { get; set; }
SaveData();
}
//etc
但如果我的处理引擎采用实现IProcessInputs 的对象,如何将输出值保存回对象中?
我想不通的是我是否应该让他们必须在该对象上实现多个接口,例如:
internal class ProcessObject1 : IProcessItem, IProcessInputs, IProcessOutput1
{
//interface implementations
}
internal class ProcessObject2 : IProcessItem, IProcessInputs, IProcessOutput2
{
//interface implementations
}
或者如果我应该为每种处理类型将接口合并为一个:
public interface IProcessType2 : IProcessItem
{
int GetID();
float GetTemp();
float Level1 { get; set; }
float Level2 { get; set; }
SaveData();
}
//etc.
【问题讨论】:
标签: c# multithreading