<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Ruminations of J.net</title>
    <description>Idle rants and ramblings of a code monkey</description>
    <link>http://www.devbiker.net/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 1.5.0.7</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://www.devbiker.net/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>J Sawyer</dc:creator>
    <dc:title>Ruminations of J.net</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/JdotNet" /><feedburner:info uri="jdotnet" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>29.758799</geo:lat><geo:long>-95.747514</geo:long><feedburner:emailServiceId>JdotNet</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
      <title>Dual Mode Data Sinks–Part II</title>
      <description>&lt;p&gt;Well, it’s been a while. Far too long, in fact. I’ve been on a project that’s … well … challenged and that’s consumed far more of my time than I would care to really dwell on. I’ll not say any more than that. So … my apologies for taking so long to continue. &lt;/p&gt;  &lt;p&gt;With that out of the way, let’s pick up with our data sinks. There were two major things left undone with the last post. First, the API. I left it without an abstracted, cleaner API that was similar to the adapter model. That’s the first thing to add. Now, we don’t want to go “all the way” with this and produce a runnable process – that would defeat one of the coolest features of a process – the ability to contain multiple sources and sinks on one clean block that starts and stops as a whole. This also allows us to send individual queries to multiple sinks (without DQC or subjects) and makes reuse of the sources across multiple sinks simpler than in the adapter model with DQC. And, to keep in consistent with the adapter model, we want to attach our sink to the stream directly from the IQStreamable interface – and this means extension method. (I’ll confess that I have come to deeply love extension methods, by the way … I really like the clean API that they create). Our extension method will encapsulate creating the observer and then binding the stream to the observer. So that we can include multiple bindings within a process, we’ll just return the streamable binding that we create. Our extension method looks like this: &lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:1a27e43c-345c-4991-b025-b1d3fe3736d2" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;ToBinding Extension Method&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IRemoteStreamableBinding&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ToBinding&amp;lt;TPayload&amp;gt;(&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IQStreamable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt; stream,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Application&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; cepApplication, &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; consumerFactoryType,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; configInfo,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventShape)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; factory = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Activator&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.CreateInstance(consumerFactoryType) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;as&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ISinkFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (factory == &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ArgumentException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Factory cannot be created or does not implement ISinkFactory&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;); &lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;switch&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (eventShape)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;case&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Interval:&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; intervalObserver =  cepApplication.DefineObserver(() =&amp;gt; factory.CreateIntervalObserverSink&amp;lt;TPayload&amp;gt;(configInfo));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; stream.Bind(intervalObserver); &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;case&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Edge:&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; edgeObserver = cepApplication.DefineObserver(() =&amp;gt; factory.CreateEdgeObserverSink&amp;lt;TPayload&amp;gt;(configInfo));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; stream.Bind(edgeObserver); &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;case&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Point:&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; pointObserver = cepApplication.DefineObserver(() =&amp;gt; factory.CreatePointObserverSink&amp;lt;TPayload&amp;gt;(configInfo));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; stream.Bind(pointObserver); &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;default&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;:&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ArgumentOutOfRangeException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;eventShape&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;We won’t call it &lt;em&gt;ToQuery(), &lt;/em&gt;doing so, while consistent, wouldn’t be descriptive at all. A binding that then gets run in a process is an inherently different thing from a query. With the adapter model, a query is a single runnable unit of logic; a binding is not. A binding can only run within the context of a process – it is the process, not the binding, that is the closest corollary to the query. But, the naming and the arguments are similar enough. Now, when we want to bind a stream to a sink, it looks like this:&lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:543b1fa1-4c37-4acf-8edd-4348c737e29d" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Binding a Stream to a Sink&lt;/div&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; sinkConfig = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleOutputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;ShowCti = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;CtiEventColor = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleColor&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Blue,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;InsertEventColor = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleColor&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Green&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; binding = data.ToBinding(cepApplication, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleOutputFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;), sinkConfig, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Point);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;binding.Run(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Hello&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;); &lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;You’ll also notice, if you haven’t noticed before, that this API forces you to use the entire event, not just the payload, when sending to the sink. While you can just send the payload to the sink and ignore the event itself, that seems quite pointless and can also cause quite a bit of confusion. I’ve seen a lot of folks put timestamps in the payload; I typically don’t. In the vast majority of cases, I rely on – and use – the timestamps on the event itself. These are the timestamps that actually matter; these are the timestamps that the StreamInsight engine is using when evaluating the event. These are the timestamps of the event within the application timeline. Anything in the payload is just an attribute of the event; the start time and end time are a key part of the definition. Also, if you only send the payload to your sink, you won’t get any CTIs at all. CTIs are kinda important, I think, for a sink for a couple of reasons. First, even if you have no events coming through but you have CTIs, you know that the engine is running and pumping data through. This is particularly useful when you aren’t getting any data at all in your sink. Without the CTIs, you won’t have a good idea if your query is actually getting processed through the engine or if you have some other error in your logic. Second … CTI’s let you know when you can/should write to a durable store in a batch. Here’s the thing – Insert events don’t get released to your sink until there is a CTI. That CTI tells you, also, that all of the events up to that point in the application time have been released to your sink. So that’s the perfect time to batch up any writes that you have to a durable store (say, Sql Server) and write them in one shot. Batched updates/inserts are going to scale far better than single writes and that’s always a very good thing in a StreamInsight application. You always need to remember that, in many cases, that sink is going to be the biggest potential bottleneck in the application because it usually involves some sort of I/O. And that I/O is always going to be slower than the raw CPU and memory-bound performance that you can get from your queries. &lt;/p&gt;  &lt;p&gt;The next thing on our list is a bit tougher. I mentioned it in my previous post and it’s the one thing that I really didn’t like about the entire reactive model when I first saw it. You see, I’m a big fan of untyped adapters, especially output adapters. Yes, they are pretty useful on the input side as well but on the output they are absolutely essential. You can’t always know what your payload is going to look like and you don’t want to be writing a sink for every different payload that you dream up. For input … in a lot of cases, you can do OK since you’ll have a good idea of what the schema is going to look like. This is something that also came up recently on the StreamInsight forum so I know I’m not the only one that misses it. Fortunately, the .NET Framework gives us a way to make this happen. It’s more work than a simple untyped adapter but, with reflection, we can get the same kind of flexibility that we had with untyped adapters in our sinks. &lt;/p&gt;  &lt;p&gt;What we want to do is to have, at the end, something similar to what an output adapter provides for us – name/value pairs where nested classes have a [ParentProperty].[ChildProperty] type name. While we’re at it, we’ll simplify it a bit; it’ll be a simple, straightforward dictionary with the name and the value, rather than having a separate event definition and then matching the index with the name, as in an untyped adapter. At the highest level, we’ll have a method called &amp;quot;GetPropertyValues” that takes the object and handles all of the details for us. Of course, it’ll be an extension method.&lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6958b63a-d308-4d01-9de1-b7ca61d2f841" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;GetPropertyValues&lt;/div&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Returns the values of properties as name/value pairs.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;source&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The object to read properties from&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Dictionary&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; GetPropertyValues(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; source )&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; propertyDictionary = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Dictionary&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(); &lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Get all of the properties. &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;AppendPropertyValues(source, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Empty, propertyDictionary);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; propertyDictionary; &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The real work is in the AppendPropertyValues method. This takes the dictionary, the object and a property name prefix and appends the properties and their values to the dictionary. To do this, first we get a list of the public instance properties on the object. From there, we loop over them. If one of them is a class, we then recurse into AppendPropertyValues but adding the source property name as the prefix. After that, we also get the fields with the same binding flags; the GetProperties method won’t return the fields and there isn’t a single reflection method that I could find that would give me both in a single call. &lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:50cc685c-6f96-43cd-86f6-e398b1a9df7a" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;AppendPropertyValues&lt;/div&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; AppendPropertyValues(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; source, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; prefix, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Dictionary&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; propertyDictionary)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; properties = source.GetType().GetProperties(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;BindingFlags&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Public | &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;BindingFlags&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Instance);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;foreach&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; propertyInfo &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; properties)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (_validProp.Contains(propertyInfo.PropertyType))&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; method = propertyInfo.GetGetMethod();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; value = method.Invoke(source, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;); &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;propertyDictionary.Add(prefix + propertyInfo.Name, value);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(propertyInfo.PropertyType.IsClass)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; method = propertyInfo.GetGetMethod();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; value = method.Invoke(source, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;AppendPropertyValues(value, prefix + propertyInfo.Name + &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, propertyDictionary); &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; fields = source.GetType().GetFields(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;BindingFlags&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Public | &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;BindingFlags&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Instance);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;foreach&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; fieldInfo &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; fields)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (_validProp.Contains(fieldInfo.FieldType))&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; value = fieldInfo.GetValue(source);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;propertyDictionary.Add(prefix + fieldInfo.Name, value);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (fieldInfo.FieldType.IsClass)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; value = fieldInfo.GetValue(source);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;AppendPropertyValues(value, prefix + fieldInfo.Name + &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, propertyDictionary);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;With this now in place, we have the same capabilities in our sinks that we had in our output adapters. Using this, we can change our ConsoleDataConsumer to display the payload properties, rather than just some basic header info. &lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:afb47276-e3d9-454a-98ed-817f90cee02d" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Code Snippet&lt;/div&gt; &lt;div style="background: #ddd; max-height: 300px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (outputEvent.EventKind == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventKind&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Insert)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.ForegroundColor = Configuration.InsertEventColor; &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventValues = outputEvent.Payload.GetPropertyValues(); &lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StringBuilder&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; output = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StringBuilder&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(2048);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;foreach&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventValue &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventValues)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;output.Append(eventValue.Key).Append(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;:&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;).Append(eventValue.Value.ToString()).Append(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;&amp;#92;t&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Insert Event Received at &amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; + outputEvent.StartTime + &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;&amp;#92;t&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; + output.ToString());&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (Configuration.ShowCti)&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.ForegroundColor = Configuration.CtiEventColor;&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;CTI event received at &amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; + outputEvent.StartTime);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li style="background: #f3f3f3"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.ResetColor();&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Now … we could certainly do some optimizations on this. For example, we could cache the property names and definitions for each of the types. I’ll leave that as an exercise for later … or for you, dear blog reader. &lt;/p&gt;  &lt;p&gt;You can download the solution from my &lt;a href="http://sdrv.ms/16V6kvj" target="_blank"&gt;SkyDrive&lt;/a&gt;. As you look, you’ll also see that I’ve done some refactoring on the project names and namespaces … &lt;/p&gt;  &lt;p&gt;&lt;iframe height="120" src="https://skydrive.live.com/embed?cid=E45DFECBE9DCC432&amp;amp;resid=E45DFECBE9DCC432%21858&amp;amp;authkey=AEw3NkM6kDDi8jc" frameborder="0" width="98" scrolling="no"&gt;&lt;/iframe&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=blqGW5pa1Cw:ArNU67l_NV4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=blqGW5pa1Cw:ArNU67l_NV4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JdotNet/~4/blqGW5pa1Cw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/JdotNet/~3/blqGW5pa1Cw/post.aspx</link>
      <author>jsawyer</author>
      <comments>http://www.devbiker.net/post/Dual-Mode-Data-Sinkse28093Part-II.aspx#comment</comments>
      <guid isPermaLink="false">http://www.devbiker.net/post.aspx?id=688ace19-e0fc-44d1-aaf8-a789dc1c4bb4</guid>
      <pubDate>Sat, 13 Apr 2013 19:04:49 -0500</pubDate>
      <category>StreamInsight</category>
      <category>Code Sample</category>
      <dc:publisher>jsawyer</dc:publisher>
      <pingback:server>http://www.devbiker.net/pingback.axd</pingback:server>
      <pingback:target>http://www.devbiker.net/post.aspx?id=688ace19-e0fc-44d1-aaf8-a789dc1c4bb4</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.devbiker.net/trackback.axd?id=688ace19-e0fc-44d1-aaf8-a789dc1c4bb4</trackback:ping>
      <wfw:comment>http://www.devbiker.net/post/Dual-Mode-Data-Sinkse28093Part-II.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.devbiker.net/syndication.axd?post=688ace19-e0fc-44d1-aaf8-a789dc1c4bb4</wfw:commentRss>
    <feedburner:origLink>http://www.devbiker.net/post.aspx?id=688ace19-e0fc-44d1-aaf8-a789dc1c4bb4</feedburner:origLink></item>
    <item>
      <title>Dual-Mode Data Sinks - Part I</title>
      <description>&lt;p&gt;Now that we have the input completed, we need to start working on the output adapters. As with the input adapters/sources, we’ll create an architecture that allows you to use the same core code whether you are using the pre-2.1 adapter model or the 2.1 and later sink model. &lt;/p&gt;  &lt;p&gt;As with our StreamInputEvent, we’ll create an abstraction that allows us to handle any event shape with the same code. This StreamOutputEvent should have properties that express all of the possible variations in event shapes as well as a generic property to hold the payload. Now, if you look at several of the StreamInsight samples, you’ll notice that they only send the payload to the sink. Certainly, that makes a couple of things easier but I don’t think that it’s really the best way to do things. A key aspect of everything StreamInsight is the temporal properties and you lose that if you don’t send the full event shape to your sink. And … the shape is really only a way of &lt;em&gt;expressing&lt;/em&gt; the event. Internally, all events, regardless of shape, have start and end times that control their lifetime in the query engine. The shape really becomes a way of how you want to “see” the events and handle them in your output. There’s nothing that stops you from expressing the same query as an edge, a point or an interval. It &lt;em&gt;will&lt;/em&gt; impact when the event gets “released” to the output adapters/sink by the engine but really, it’s just a matter of how you want to see the event and when you want to get it to your output. But, before I go any further, here’s our StreamOutputEvent: &lt;/p&gt;    &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c6da12fa-2a0e-4e67-9fd9-9d75d283d822" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;StreamOutputEvent&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 400px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamOutputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Creates an output event from a source event.&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;sourceEvent&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The source event.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamOutputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt; Create(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PointEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt; sourceEvent)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; outputEvent = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamOutputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;()&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;StartTime = sourceEvent.StartTime,&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;EventKind = sourceEvent.EventKind, &lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;EventShape = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Point&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (sourceEvent.EventKind == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventKind&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Insert)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;outputEvent.Payload = sourceEvent.Payload; &lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; outputEvent; &lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Creates an output event from a source event.&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;sourceEvent&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The source event.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamOutputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt; Create(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IntervalEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt; sourceEvent)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; outputEvent = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamOutputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;()&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;StartTime = sourceEvent.StartTime,&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;EventKind = sourceEvent.EventKind,&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;EventShape = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Interval&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (sourceEvent.EventKind == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventKind&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Insert)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;outputEvent.EndTime = sourceEvent.EndTime; &lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;outputEvent.Payload = sourceEvent.Payload;&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; outputEvent;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Creates an output event from a source event.&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;sourceEvent&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The source event.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamOutputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt; Create(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt; sourceEvent)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; outputEvent = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamOutputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;()&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;StartTime = sourceEvent.StartTime,&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;EventKind = sourceEvent.EventKind,&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;EventShape = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Edge&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (sourceEvent.EventKind == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventKind&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Insert)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;outputEvent.Payload = sourceEvent.Payload;&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;outputEvent.EdgeType = sourceEvent.EdgeType;&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (sourceEvent.EdgeType == Microsoft.ComplexEventProcessing.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeType&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.End)&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;outputEvent.EndTime = sourceEvent.EndTime; &lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; outputEvent;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; StartTime { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;  }&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventKind&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; EventKind { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;? EndTime { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;  }&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; EventShape { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;  }&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeType&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;? EdgeType { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; TPayload Payload { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;With constructors for each different event shape, this is something that we can easily create from an event stream and then send to a single set of code that handles the outbound event. &lt;/p&gt;  &lt;p&gt;When creating the sink and hooking it to the stream, it’s a matter of how you create your observer and the type specified for the TElement. Very simply, the key thing that dictates what StreamInsight “sends” to your sink is the type for the observer’s generic class parameter. If you specify IObserver&amp;lt;TPayload&amp;gt;, you’ll only get the payload. However, if you specify IObserver&amp;lt;PointEvent&amp;lt;TPayload&amp;gt;&amp;gt;, you’ll get a point event (and so on for intervals and edges). Since our event consumer should be able to consume events of any shape, we will actually need to implement the observer interface for each of the shapes. While it may be tempting to try to implement one interface based on TypedEvent&amp;lt;T&amp;gt;, it won’t work. Yes, I tried. But StreamInsight requires that your sinks specify the payload as the type for the observer or one of the TypedEvent&amp;lt;T&amp;gt; child classes. If you don’t specify an event shape, StreamInsight will handle the events and release them to the output adapter as though they were point events. For some very basic scenarios, this works. But when you start getting into some of the more interesting scenarios for StreamInsight, you’ll want to do a lot more with your output than to view it as a point. But … this is for the next post. Let’s get back to our implementation. &lt;/p&gt;  &lt;p&gt;As we did with our input producer, we’ll create a common, abstract base class for all of our event consumers. Our concrete consumers will inherit from this class and handle whatever is necessary to write the data to our target, whatever it may be. Again, as with the producer, we’ll specify a configuration class; while the reactive StreamInsight API no longer requires it, the reality is that you will want to have a configuration class for your sinks; you don’t want to hard-code things like database connection strings, web service target URIs or anything like that in your event consumers. But the key thing that our base class will do is to implement the interface for each of the event shapes, translate them to our StreamOutputEvent and then send to our actual event consumer’s code.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8382fdf3-b16d-48f6-9221-a15436443cc4" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;StreamEventConsumer&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 400px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;abstract&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamEventConsumer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType, TConfigType&amp;gt; : &lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PointEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;&amp;gt;, &lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;&amp;gt;, &lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IntervalEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;protected&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; StreamEventConsumer(TConfigType configuration)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{ &lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Configuration = configuration; &lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; TConfigType Configuration { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;abstract&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Completed();&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;abstract&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Error(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Exception&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; error);&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;abstract&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; EventReceived(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamOutputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt; outputEvent);&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OnNext(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PointEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt; value)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;EventReceived(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamOutputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;.Create((&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PointEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;)value));&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OnNext(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IntervalEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt; value)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;EventReceived(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamOutputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;.Create((&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IntervalEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;)value));&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OnNext(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt; value)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;EventReceived(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamOutputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;.Create((&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;)value));&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OnCompleted()&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;Completed(); &lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OnError(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Exception&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; error)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;Error(error);&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;From here, we’ll continue to build the architecture much the same way that we built the event producers. For each consumer, we’ll have a factory that handles the details of creating and starting the consumer based on a common interface. &lt;/p&gt;    &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:3aa09ffb-16d7-48bd-b401-08b1037db3dd" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;ISinkFactory&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 400px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;interface&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ISinkFactory&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PointEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;&amp;gt; CreatePointObserverSink&amp;lt; TPayload&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config);&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;&amp;gt; CreateEdgeObserverSink&amp;lt;TPayload&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config);&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IntervalEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;&amp;gt; CreateIntervalObserverSink&amp;lt;TPayload&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config);&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;Between StreamEventConsumer and ISinkFactory, it’s now a small step to create a concrete factory and consumer – as well as the adapters. For simplicity’s sake, we’ll use a console consumer. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:569accd4-5a63-4e0a-b9ee-ed374273a447" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Console Data Consumer&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 400px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleDataConsumer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;:&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamEventConsumer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleOutputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ConsoleDataConsumer(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleOutputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; configuration) : &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;base&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(configuration)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Completed()&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Nothing necessary. &lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Error(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Exception&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; error)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Error occurred:&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; + error.ToString());&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; EventReceived(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamOutputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt; outputEvent)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (outputEvent.EventKind == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventKind&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Insert)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.ForegroundColor = Configuration.InsertEventColor; &lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Insert Event Received at &amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; + outputEvent.StartTime);&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (Configuration.ShowCti)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.ForegroundColor = Configuration.CtiEventColor;&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;CTI event received at &amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; + outputEvent.StartTime);&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.ResetColor();&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Our factory handles the dirty details of hooking up to our source streams as well as our output adapters. By forcing the factory to implement methods for each event shape we both ensure that we get the interface that we need when creating the sink and tying it to our streams as well as the opportunity to say, in code, that a particular output sink doesn’t support specific shapes, should that be appropriate. &lt;/p&gt;    &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2b157140-7dce-492d-96b7-dab182c6f620" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;ConsoleOutputFactory&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 400px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleOutputFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;:&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ISinkFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; , &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ITypedOutputAdapterFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleOutputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;  &lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PointEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;&amp;gt; CreatePointObserverSink&amp;lt;TPayload&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleDataConsumer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;((&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleOutputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)config);&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;&amp;gt; CreateEdgeObserverSink&amp;lt;TPayload&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleDataConsumer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;((&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleOutputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)config);&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IntervalEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;&amp;gt; CreateIntervalObserverSink&amp;lt;TPayload&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleDataConsumer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;((&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleOutputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)config);&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;OutputAdapterBase&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Create&amp;lt;TPayload&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleOutputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; configInfo, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventShape)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;switch&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (eventShape)&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;case&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Interval:&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ObserverTypedIntervalOutputAdapter&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;(CreateIntervalObserverSink&amp;lt;TPayload&amp;gt;(configInfo)); &lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;break&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;case&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Edge:&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ObserverTypedEdgeOutputAdapter&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;(CreateEdgeObserverSink&amp;lt;TPayload&amp;gt;(configInfo)); &lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;break&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;case&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Point:&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ObserverTypedPointOutputAdapter&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;(CreatePointObserverSink&amp;lt;TPayload&amp;gt;(configInfo));&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;break&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;default&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;:&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ArgumentOutOfRangeException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;eventShape&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Dispose()&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//throw new NotImplementedException();&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;We’ve not touched on the output adapters yet so now’s the time to introduce them; they are, after all, already referenced in our factory. As before, we have a single factory for our producers using the 2.1+ Reactive model as well as our legacy adapter mode. As with our input adapters, the output adapters are relatively thin wrappers around our event consumers that handle the details of lifetime. Unlike the input adapters, with the output adapters, we may well get some data after our “stop” event and we want to make sure that we dequeue all events before shutting down. To control this a little better, we use Monitor.Enter and Monitor.Exit directly rather than the basic lock{} block provided by C#. The lock block, by the way, creates, behind the scenes, a Monitor.Enter/Monitor.Exit pair. However, using this directly allows us to minimize the possibility of deadlocks if we get into a scenario where we are actively dequeuing events when we get a Resume call. By using Monitor.TryEnter(), we can attempt to enter our dequeuing thread from other threads without blocking. If the lock has already been acquired, we don’t need to spin up another thread to dequeue and we certainly don’t need to block waiting for a lock that we won’t actually need once we get it. Our dequeue thread will continue to dequeue 1 event at a time until nothing is left in the queue. And we need to make sure that the dequeue operation is synchronized – only 1 thread can dequeue at a time anyway. Adding multiple threads to the dequeue operation typically won’t help us and we want to make sure that we have all available threads available to process actual query results. Now … once we’ve dequeued, we may want to use techniques to multi-thread sending the results to the final target. But … our actual dequeue from each query/process should be single threaded. Keep in mind, however, that you’ll have multiple, single-threaded output sinks in most real-world applications. You will be multi-threaded, have no worries there. And calls into our event consumers can come from any thread, which is why we need to use locks to make sure that we’re properly synchronized. This is particularly important when our output adapter is stopped. After stop is called, we’ll get one more change to empty our queue. We use the monitor to make sure that we do empty all available events from the queue before calling Stopped(). This ensures that we’ll have a nice, clean shutdown with no hangs and no ObjectDisposedExcetpions. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d3ddb4c3-9b71-4d25-90bd-47fc7ae72660" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Point Output Adapter&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 400px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ObserverTypedPointOutputAdapter&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;: &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TypedPointOutputAdapter&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;readonly&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PointEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;&amp;gt; _sinkObserver;&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ObserverTypedPointOutputAdapter(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PointEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;&amp;gt; sinkObserver)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;_sinkObserver = sinkObserver; &lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Stop()&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;try&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Monitor&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Enter(_monitorObject);&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//On last round to dequeue &lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;EmptyQueue();&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Completed &lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;_sinkObserver.OnCompleted(); &lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;finally&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Monitor&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Exit(_monitorObject);&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;base&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Stop();&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;Stopped(); &lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Resume()&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;System.Threading.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; thd = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(DequeueEvents);&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;thd.Start();&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Start()&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;System.Threading.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; thd = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Thread&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(DequeueEvents);&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;thd.Start();&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; _monitorObject = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(); &lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; DequeueEvents()&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.AdapterState != &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AdapterState&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Running)&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Ensures only 1 thread is dequeuing and no other threads are blocked.&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Monitor&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.TryEnter(_monitorObject))&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;try&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;EmptyQueue();&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;catch&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Exception&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ex)&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;_sinkObserver.OnError(ex);&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;finally&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Monitor&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Exit(_monitorObject);&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Ready(); &lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; EmptyQueue()&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PointEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt; dequeuedEvent;&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;while&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Dequeue(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;out&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; dequeuedEvent) == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DequeueOperationResult&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Success  )&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;_sinkObserver.OnNext(dequeuedEvent);&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;Now that we have all of the core pieces in place, let’s take a look at what we need to do to hook our sink up to the console output. It’s actually very simple. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:9843d86a-22b9-4270-8a5b-0e202a16921e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Hooking up to a stream&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 400px; overflow: auto; padding: 2px 5px;"&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; RunProcess(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Application&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; cepApplication)&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (){&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;NumberOfItems=20, &lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;RefreshInterval=&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TimeSpan&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.FromMilliseconds(500)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; data = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;RxStream&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;.Create(cepApplication, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;), config, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Point);&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; factory = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ConsoleOutputAdapter.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleOutputFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;();&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; sink = cepApplication.DefineObserver(() =&amp;gt; factory.CreatePointObserverSink&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;br&gt;                                                        &lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ConsoleOutputAdapter.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleOutputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;()&lt;/span&gt;&lt;br&gt;                                                            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                                                                &lt;span style="background:#ffffff;color:#000000"&gt;ShowCti = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;,&lt;/span&gt;&lt;br&gt;                                                                &lt;span style="background:#ffffff;color:#000000"&gt;CtiEventColor = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleColor&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Blue,&lt;/span&gt;&lt;br&gt;                                                                &lt;span style="background:#ffffff;color:#000000"&gt;InsertEventColor = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ConsoleColor&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Green&lt;/span&gt;&lt;br&gt;                                                            &lt;span style="background:#ffffff;color:#000000"&gt;}));&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;data.Bind(sink).Run(); &lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;There’s one thing that you may notice … the sink needs to know all of the details about the data class. This is far from ideal … and one of the things that I found so powerful about the untyped adapter model – you weren’t tied to the schema of your data classes. There are various ways that we can handle this but that’s a topic for the next entry. Until then, you can download the code from my &lt;a href="https://skydrive.live.com/redir?resid=E45DFECBE9DCC432!786&amp;amp;authkey=!AFqztFJdCvFm_xQ" target="_blank"&gt;SkyDrive&lt;/a&gt;. &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=o4slMUe024I:BkklIMqdoNE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=o4slMUe024I:BkklIMqdoNE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JdotNet/~4/o4slMUe024I" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/JdotNet/~3/o4slMUe024I/post.aspx</link>
      <author>jsawyer</author>
      <comments>http://www.devbiker.net/post/Dual-Mode-Data-Sinks-Part-I.aspx#comment</comments>
      <guid isPermaLink="false">http://www.devbiker.net/post.aspx?id=499ff8d6-ed0c-413c-b7dc-9e01b2a71b3e</guid>
      <pubDate>Mon, 18 Feb 2013 12:24:06 -0500</pubDate>
      <dc:publisher>jsawyer</dc:publisher>
      <pingback:server>http://www.devbiker.net/pingback.axd</pingback:server>
      <pingback:target>http://www.devbiker.net/post.aspx?id=499ff8d6-ed0c-413c-b7dc-9e01b2a71b3e</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.devbiker.net/trackback.axd?id=499ff8d6-ed0c-413c-b7dc-9e01b2a71b3e</trackback:ping>
      <wfw:comment>http://www.devbiker.net/post/Dual-Mode-Data-Sinks-Part-I.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.devbiker.net/syndication.axd?post=499ff8d6-ed0c-413c-b7dc-9e01b2a71b3e</wfw:commentRss>
    <feedburner:origLink>http://www.devbiker.net/post.aspx?id=499ff8d6-ed0c-413c-b7dc-9e01b2a71b3e</feedburner:origLink></item>
    <item>
      <title>Dual Mode Data Sources-Part III</title>
      <description>&lt;p&gt;In the two previous postings, we would through creating the data sources and exposing them to both the new Reactive-centric API and the “legacy” adapter-centric API. While we’ve accomplished that, I also said that we’d revisit the 2.1 code to add a layer of consistency to the APIs; we’re going to “bring back” factories and integrate these into our API. Why on earth would I do that? Didn’t we just get rid of them to make things simpler? Well, yes, we did just do away with the requirement of a factory but that doesn’t mean that they aren’t a good idea. Implementing the factory pattern will hide the details of creating the actual data source – our current one is pretty simple but others may get quite complex – and provide a layer to “check” requirements before we try to start the query (we’re already doing this with the adapter factory). I also happen to like consistent APIs and keeping consistency whenever practical and possible. &lt;/p&gt;  &lt;p&gt;We’ll start by creating an interface. We may – and likely will – also wind up creating an abstract base class that implements the interface and handles common functionality but that will be refactored later after we write some more sources and get a better feel of how to best define the base class. And … having both an interface and a base class gives us the greatest level of flexibility when implementing later on; because our API is based on interfaces, we can inherit from other, existing code and/or components and just add the interface. If we based our API exclusively on base classes, the single-inheritance rule would limit what that. This interface will be pretty simple and only have a single method. &lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5c15451b-535c-48a4-a404-fc2d6161cdeb" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;ISourceFactory&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 300px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Interface for data source factories.&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;interface&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ISourceFactory&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Creates an observable source.&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;typeparam name=&amp;quot;TPayload&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Type of the payload.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;config&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Configuration class.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;eventShape&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Shape of the events&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObservable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;&amp;gt; CreateObservableSource&amp;lt;TPayload&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventShape);&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;You may notice a slight different between this and the input adapter factory interface – config is not strongly typed. Yes, we could do that … define a generic interface and then use reflection to call it. But, to be honest, I really didn’t want to go through all of the contortions to make that happen. So the config is an object.&lt;/p&gt;  &lt;p&gt;Now, when we implement this on our existing factory, we also refactor things a bit to maximize code reuse.&lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:08271bf9-d278-4c61-b13e-ca4dcad07db0" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Adapter + Source Factory&lt;/div&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;sealed&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ITypedInputAdapterFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ISourceFactory&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;SuppressMessage&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Microsoft.Design&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;CA1004:GenericMethodsShouldProvideTypeParameter&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, Justification = &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;By Design&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)]&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;InputAdapterBase&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Create&amp;lt;TPayload&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; configInfo, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventShape)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;CheckPayloadType&amp;lt;TPayload&amp;gt;();&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ObservableTypedPointInputAdapter&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(CreateProducer(configInfo, eventShape));&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObservable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;&amp;gt; CreateObservableSource&amp;lt;TPayload&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventShape)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Check the payload type. &lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;CheckPayloadType&amp;lt;TPayload&amp;gt;();&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Check the config class for the proper type. &lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; typedConfig = config &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;as&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (typedConfig == &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Invalid cast&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ArgumentException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Configuration class must be of type TestDataInputConfig&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObservable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;&amp;gt;)CreateProducer(typedConfig, eventShape);&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; CheckPayloadType&amp;lt;TPayload&amp;gt;()&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Check the payload.&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(TPayload) != &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;))&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//this won&amp;#39;t work. &lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//throw an exception. &lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;InvalidOperationException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Specified type must be of &amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; + &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;).FullName);&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataProducer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; CreateProducer(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventShape)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;switch&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (eventShape)&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;case&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Point:&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Create the publisher. &lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataProducer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(config);&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;default&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;:&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ArgumentException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Format(&lt;/span&gt;&lt;br&gt;                         &lt;span style="background:#ffffff;color:#000000"&gt;System.Globalization.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;CultureInfo&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.InvariantCulture,&lt;/span&gt;&lt;br&gt;                         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;TestDataInputFactory cannot instantiate adapter with event shape {&lt;/span&gt;&lt;span style="background:#ffffff;color:#3cb371"&gt;0}&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;,&lt;/span&gt;&lt;br&gt;                         &lt;span style="background:#ffffff;color:#000000"&gt;eventShape.ToString()));&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Dispose()&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;You’ll notice that both methods … source and adapter … use all of the same validation logic and code. Using this in our existing code isn’t too difficult. Our new “RunProcess()” now looks like the following: &lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:501feb9f-f4ec-4fe5-adff-6e82f0a7acf1" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Run Process&lt;/div&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; RunProcess(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Application&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; cepApplication)&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (){&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;NumberOfItems=20, &lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;RefreshInterval=TimeSpan.FromMilliseconds(500)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; data = cepApplication.DefineObservable(&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;() =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;().CreateObservableSource&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(config,&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Point ))&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;.ToPointStreamable(e =&amp;gt; e.GetPointEvent());&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; sink = cepApplication.DefineObserver(() =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Observer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;e =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;TestEvent ItemId:{&lt;/span&gt;&lt;span style="background:#ffffff;color:#3cb371"&gt;0}&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt; Run:{&lt;/span&gt;&lt;span style="background:#ffffff;color:#3cb371"&gt;1}&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt; Value{&lt;/span&gt;&lt;span style="background:#ffffff;color:#3cb371"&gt;2}&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, e.ItemId, e.RunNumber, e.Value)));&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;data.Bind(sink).Run(); &lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;We can still make it better, though, and make make it look more like the pre-2.1 API. We’ll start by creating an RxStream class and add methods for creating observables. We’ll also want to make sure that these methods are remotable – so we can work with either a local or a remote instance without any code changes. This was a challenge with the pre-2.1 API; you could pretty easily get yourself into a situation where your code work work on a local, in-process instance but not work at all when you were connecting to a remote instance. With DefineObservable, however, it’s actually defining a remote function that returns an observable and that’s what we call … whether in process or remote. If it works in-process then it’ll work out of process. However, you may wind up getting yourself into a situation with mysterious serialization errors … you need to make sure that whatever you pass to your methods if fully serializable. That’s why our configuration class has the DataContract attribute. With our CreateObservable method, we’ll first check to see if we have a reference to the function (and notice that it is of type Func&amp;lt;&amp;gt;). If not, we check to see if it’s been created and deployed. If not, we create and deploy it. We could also put this same code in a static constructor – it wouldn’t make much difference. The actual work is done by an InstantiateObservable private method and that’s what our defined Observable actually calls.&lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c3a0863a-6eb3-40d0-a9e9-1805610f10f1" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;RxStream Observables&lt;/div&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Func&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IQbservable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;&amp;gt;&amp;gt; _observable; &lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IQbservable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;&amp;gt; CreateObservable(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Application&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; cepApplication, &lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; sourceFactoryType,&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; configInfo,&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventShape)&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; entityName = &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Observable:&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; + &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (TPayload).FullName;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (_observable == &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Check the application. &lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (cepApplication.Entities.ContainsKey(entityName))&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;_observable =&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;cepApplication.GetObservable&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;&amp;gt;(entityName);&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Define and deploy. &lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;_observable = cepApplication.DefineObservable(&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; t, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; c, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; e) =&amp;gt; InstantiateObservable(t, c, e));&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;_observable.Deploy(entityName);&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; _observable.Invoke(sourceFactoryType, configInfo, eventShape);&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObservable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt;&amp;gt; InstantiateObservable(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; sourceFactoryType,&lt;/span&gt;&lt;br&gt;                                                                               &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; configInfo,&lt;/span&gt;&lt;br&gt;                                                                               &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventShape)&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; sourceFactory = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Activator&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.CreateInstance(sourceFactoryType) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;as&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ISourceFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (sourceFactory == &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ArgumentException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Specified type is not a source factory.&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; sourceFactory.CreateObservableSource&amp;lt;TPayload&amp;gt; (configInfo, eventShape);&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Now all that we have left to do is to create methods to also create the streams, rather than just the observables. This will be our typical use case but we’ll still keep the observable method public as well to give us the most flexibility when we are actually using this in anger. &lt;/p&gt;  &lt;p&gt;   &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:739af6bc-c4f4-46fb-8753-5a511a1c8ebe" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;RxStream Create&lt;/div&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IQStreamable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt; Create(&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Application&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; cepApplication, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; sourceFactoryType, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; configInfo, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventShape)&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Create(cepApplication, sourceFactoryType, configInfo, eventShape, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IQStreamable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayload&amp;gt; Create(&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Application&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; cepApplication, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Type&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; sourceFactoryType, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; configInfo, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventShape, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AdvanceTimeSettings&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; advanceTimeSettings)&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;  &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; observable = CreateObservable(cepApplication, sourceFactoryType, configInfo, eventShape);&lt;/span&gt;&lt;br&gt; &lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;switch&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (eventShape)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;case&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Interval:&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; observable.ToIntervalStreamable(e =&amp;gt; e.GetIntervalEvent(), advanceTimeSettings);&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;case&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Edge:&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; observable.ToEdgeStreamable(e =&amp;gt; e.GetEdgeEvent(), advanceTimeSettings);&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;case&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Point:&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; observable.ToPointStreamable(e =&amp;gt; e.GetPointEvent(), advanceTimeSettings);&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;default&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;:&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ArgumentOutOfRangeException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;eventShape&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt; &lt;/p&gt;  &lt;p&gt;Once this is in place, the code to create our stream look remarkably similar to the adapter-centric code: &lt;/p&gt;  &lt;div id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:2ba59ac5-72ca-4ea3-b2b8-9b90837e92f3" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Creating the Stream&lt;/div&gt; &lt;div style="background-color: #ffffff; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (){&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;NumberOfItems=20, &lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;RefreshInterval=TimeSpan.FromMilliseconds(500)&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; data = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;RxStream&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;.Create(cepApplication, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;), config, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Point);&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;There’s still more that we’ll need to do … for example, we’ll need to create overloads to import CTIs. But, for now, we’re done with the core API for our input adapters and will be moving on to output adapters/sinks in the next article. &lt;/p&gt;  &lt;p&gt;You can download the current from &lt;a href="http://sdrv.ms/ZVS45w"&gt;SkyDrive&lt;/a&gt;.&amp;#160; &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=nZM97kdpnJ4:2AhdkT7Et6w:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=nZM97kdpnJ4:2AhdkT7Et6w:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JdotNet/~4/nZM97kdpnJ4" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/JdotNet/~3/nZM97kdpnJ4/post.aspx</link>
      <author>JSawyer</author>
      <comments>http://www.devbiker.net/post/Dual-Mode-Data-Sources-Part-III.aspx#comment</comments>
      <guid isPermaLink="false">http://www.devbiker.net/post.aspx?id=c639882b-34a8-4988-92ea-47aca39bbe81</guid>
      <pubDate>Wed, 02 Jan 2013 21:41:55 -0500</pubDate>
      <category>StreamInsight</category>
      <category>Code Sample</category>
      <dc:publisher>JSawyer</dc:publisher>
      <pingback:server>http://www.devbiker.net/pingback.axd</pingback:server>
      <pingback:target>http://www.devbiker.net/post.aspx?id=c639882b-34a8-4988-92ea-47aca39bbe81</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.devbiker.net/trackback.axd?id=c639882b-34a8-4988-92ea-47aca39bbe81</trackback:ping>
      <wfw:comment>http://www.devbiker.net/post/Dual-Mode-Data-Sources-Part-III.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.devbiker.net/syndication.axd?post=c639882b-34a8-4988-92ea-47aca39bbe81</wfw:commentRss>
    <feedburner:origLink>http://www.devbiker.net/post.aspx?id=c639882b-34a8-4988-92ea-47aca39bbe81</feedburner:origLink></item>
    <item>
      <title>Using Subjects as a “Feedback Loop”</title>
      <description>&lt;p align="left"&gt;OK, I’m going to switch gears for a minute here. Yes, I’ll be back to building the app but this is just too cool to not share. It’s something that I’ve thought about quite a bit off and on and a forum post got it going again so I put together a sample last night that shows how it can be done. The question … how do I take the output of a query and feed it back in to the query itself? This has a number of uses; in the case of the forum post, the developer wants to use this to update running totals and balances as orders are processed because these results impact the rest of the events. When working with sensors, this is also how you would do a “deadband” … an output isn’t produced unless the new value is more than a certain percentage change from the previous. For the deadband use case, you can’t just compare to the previous reading; if you do this, slow changes can accumulate but a new value is never reported because the change between any two values is less than the deadband threshold. So you need to compare the current reading value to the &lt;em&gt;last reported value.&lt;/em&gt; I’ve done with with a UDO that maintains state (in a dictionary) for each of the items but it’s not as elegant as I’d like. And this is cooler anyway. &lt;img style="border-bottom-style: none; border-left-style: none; border-top-style: none; border-right-style: none" class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://www.devbiker.net/image.axd?picture=wlEmoticon-smile_2.png" /&gt;&amp;#160;&lt;/p&gt;  &lt;p align="left"&gt;So … what is a subject? A subject is an observer and and observable; it will republish events that it observes (via IObserver) to others that are observing it (via IObservable). For a little primer on subjects, check out this &lt;a href="http://blogs.msdn.com/b/streaminsight/archive/2012/08/30/using-subjects-to-deploy-queries-dynamically.aspx" target="_blank"&gt;blog entry&lt;/a&gt; from Colin on the StreamInsight team; it gives you a hint of what you can do with these. But that’s just the tip of the iceberg; subjects have become one of my favorite little tricks in StreamInsight because there’s so much that you can do with them. As Colin mentions, observers can come and go – so you can hook up multiple sinks to a single output query (something very difficult prior to 2.1). What Colin doesn’t mention is that your sources (observables) can come and go also … you can hook up multiple source queries that then get fed to one or more sinks. &lt;/p&gt;  &lt;p align="left"&gt;Subjects are created and deployed independently of their sources and sinks – you can create a subject that you are using as a source before you actually hook it up to a sink. Or vice-versa. Subjects also allow you to share query results across processes – similar to what you would do with dynamic query composition but far, far, far more powerful and flexible. &lt;/p&gt;  &lt;p align="left"&gt;Now, because a subject is both a &lt;em&gt;source&lt;/em&gt; and a &lt;em&gt;sink&lt;/em&gt;, you can use them to take the output results of a query and feed them back in to the source query … creating a feedback loop. Or a time warp.&lt;/p&gt;  &lt;p align="left"&gt;Creating a subject is pretty simple. There isn’t much code required. You just need to know what type you’ll be using. You can bind the subject to the payload type only – you only get the payload and no temporal header – or to the TypedEvent (i.e. PointEvent, IntervalEvent, etc), in which case you will get the payload and the temporal header. Let’s start there. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7d674427-ce09-4f82-a685-22f5bb8fea0e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;GetOrCreateSubject&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 400px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; _subjectLock = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;();&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IRemoteSubject&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TSubject, TSubject&amp;gt; GetOrCreateSubject&amp;lt;TSubject&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Application&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; cepApplication, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; subjectName)&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;lock&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (_subjectLock)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; subjectExists = cepApplication.Subjects.Any(s =&amp;gt; s.Key == subjectName);&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (subjectExists)&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; cepApplication.GetSubject&amp;lt;TSubject, TSubject&amp;gt;(subjectName);&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; cepApplication.CreateSubject(subjectName, () =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Subject&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TSubject&amp;gt;());&lt;/span&gt;&lt;br&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p align="left"&gt;As the name says, this method will get or create a subject, depending on if it’s already created or not. If you are wondering about the _subjectLock, that’s there to ensure that only one thread is in the middle of this operation at any time. If you are multi-threading calls to this, it is entirely possible to get into a situation where you are calling the same method with the same arguments on different threads and wind up with exceptions as multiple threads try to create the same subject at the same time. &lt;/p&gt;  &lt;p align="left"&gt;Now, let’s get data running through our test app. I’m using the same app from my recent posts so this will look familiar. We’ll also get a reference to the subject.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:c90f55ce-c91d-486e-ad69-1c0a762365ea" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Getting Data&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 400px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ()&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;NumberOfItems=20, &lt;/span&gt;&lt;br&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;RefreshInterval=&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TimeSpan&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.FromMilliseconds(500)&lt;/span&gt;&lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;br&gt; &lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; data = cepApplication.DefineObservable(&lt;/span&gt;&lt;br&gt;                     &lt;span style="background:#ffffff;color:#000000"&gt;() =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataProducer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(config)).ToPointStreamable(e =&amp;gt; e.GetPointEvent());&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;br&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; lastReportedSubject = GetOrCreateSubject&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PointEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt;(cepApplication, &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;LastKnown&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;We aren’t sending data to the subject just yet … that will be from the results later … but we do need to get a stream (IQStreamable) from it. But let’s stop for a moment and discuss some of the potential gotchas. First, remember that a stream in StreamInsight is a &lt;em&gt;temporal &lt;/em&gt;stream. All of the events exist in time and the stream moves forward based on CTIs. We also know that we’ll be joining this feedback stream with the data stream and, when you do that, StreamInsight will synch to the slowest stream … the joined stream will move forward only when CTIs from &lt;em&gt;both&lt;/em&gt; source streams move past the same timestamp. If our feedback loop simply publishes the CTIs that are generated from our result stream, &lt;em&gt;it will never move forward&lt;/em&gt;. Why not? Because it’ll be waiting for CTIs to move past a timestamp from the result stream but the result stream can’t move forward because there is no CTI coming from our feedback stream. Did that make sense? It makes my brain hurt thinking about it too much. Anyway, what we need to do is to directly &lt;em&gt;import&lt;/em&gt; the CTIs from the data stream. But that gives us another challenge. If we do that, we now have to worry about CTI violations from the data (insert) events being published from the results. You see, the events produced will have start times that are &lt;em&gt;before&lt;/em&gt; the last-issued CTI; they must be or they wouldn’t be in the output stream. So we need to account for this when we enqueue the new events by shifting the start time forward so that it is &lt;em&gt;after&lt;/em&gt; the last-issued CTI.&lt;/p&gt;  &lt;p&gt;So let’s get started. To handle the CTIs, we’ll first filter the subject observable source so that it only produces Insert events. Then we will Merge these results it the CTIs from the data stream. The result will be an observable that we can then use as the source for the feedback stream. A note, however, on using the Merge technique to import CTIs … it will give you no protection &lt;em&gt;at all&lt;/em&gt; from CTI violations. If you try to create/enqueue an event that violates the CTI, you &lt;em&gt;will&lt;/em&gt; get an exception that you can’t really catch and it &lt;em&gt;will&lt;/em&gt; cause your query to abort. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e7b3f072-648b-41de-8775-fc8826cb3a15" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Feedback Source&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 400px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; lastReportedObservableSource = lastReportedSubject&lt;/span&gt;&lt;br&gt;                                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Get only the inserts from the subject, dropping the CTIs&lt;/span&gt;&lt;br&gt;                                     &lt;span style="background:#ffffff;color:#000000"&gt;.Where(e =&amp;gt; e.EventKind == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventKind&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Insert)&lt;/span&gt;&lt;br&gt;                                     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Merge with the CTIs from the data stream.&lt;/span&gt;&lt;br&gt;                                     &lt;span style="background:#ffffff;color:#000000"&gt;.Merge(data.ToPointObservable().Where(e =&amp;gt; e.EventKind == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventKind&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Cti));&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Now that we have our observable, we need to make it a stream. While it is still an observable (IQbservable), we don’t have to follow the temporal/CTI rules because it’s not a temporal stream yet. However, when it’s a stream (IQStreamable), it is a temporal stream and we do have to follow the temporal/CTI rules … so we have to shift the timestamps of our point events so that they don’t violate the CTI. With the data source that we are using, we know that the CTIs are 1 tick past the “batch” of events so shifting the timestamp 1 tick will ensure that we’re good. In the real world, you may need to something a bit more sophisticated … see my previous &lt;a href="http://www.devbiker.net/post/Importing-CTIs-with-IQStreamableIQbservable-in-StreamInsight-21.aspx" target="_blank"&gt;blog article on importing CTIs in 2.1&lt;/a&gt; for a couple of tips; I will be revisiting this in my app-building series. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b8c45400-6d72-47b8-bbf2-d0586f49001b" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Feedback Stream&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 400px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; lastReportedSourceStream = lastReportedObservableSource&lt;/span&gt;&lt;br&gt;                                     &lt;span style="background:#ffffff;color:#000000"&gt;.ToPointStreamable(e =&amp;gt; e.EventKind == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventKind&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Cti ? e : &lt;/span&gt;&lt;br&gt;                                         &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PointEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;.CreateInsert(e.StartTime.AddTicks(1), e.Payload));&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The hard part is done. Now that we have the streams, the rest is a series of StreamInsight queries. First, we want to make sure that we always have the last-known value available in the last reported value stream so we’ll use the (very) common ToSignal pattern. Next, we need to make sure that the initial values reported &lt;em&gt;always&lt;/em&gt; go through. If we just join the streams, we’ll never get output because the initial events won’t be in the feedback stream. So we’ll do a LeftAntiJoin so that the events in the data stream with no matches in the feedback stream go through. (Depending on your scenario, it may be perfectly appropriate to “seed” the feedback stream with initial events … in the case of the forum post, these could be current balances when the application starts. If that’s the case, you can probably skip this step.) Then we calculate the percentage change from the last reported value for the current value; in this step, I’m including both the current and the last reported value in the stream (we don’t really need to) so that it’s easier to check the results using the &lt;a href="http://msdn.microsoft.com/en-us/library/ff518532.aspx" target="_blank"&gt;event flow debugger&lt;/a&gt; and “see” everything that’s happening. From the calculation, we then select only those items that have changed more than a specified amount. Since we’re using random, very variable data in this sample, I’ve put the “deadband” at 100% but real-world will be somewhat less; anywhere from 1% – 10%, depending on the source. Union the two queries together and we’re done! (with the queries, at least).&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6800a114-4528-436f-ad37-7c46c3d5eb86" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;The Queries&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 400px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Make sure that we have the last reported value always available.&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; lastReportedStream = lastReportedSourceStream.ToSignal((e1, e2) =&amp;gt; e1.ItemId == e2.ItemId);&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Make sure that our initial values always get reported in the output using LeftAntiJoin. &lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; firstValues =&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;from&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; i &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; data.LeftAntiJoin(lastReportedStream, (e1, e2) =&amp;gt; e1.ItemId == e2.ItemId)&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;select&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; i; &lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Calculate the change from the previous.&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; calcStream = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;from&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; d &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; data &lt;/span&gt;&lt;br&gt;                  &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;join&lt;/span&gt;&lt;br&gt;                      &lt;span style="background:#ffffff;color:#000000"&gt;lr &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; lastReportedStream&lt;/span&gt;&lt;br&gt;                      &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;on&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; d.ItemId &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;equals&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; lr.ItemId&lt;/span&gt;&lt;br&gt;                  &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;select&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;br&gt;                      &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;br&gt;                          &lt;span style="background:#ffffff;color:#000000"&gt;Value = d,&lt;/span&gt;&lt;br&gt;                          &lt;span style="background:#ffffff;color:#000000"&gt;LastReported = lr, &lt;/span&gt;&lt;br&gt;                          &lt;span style="background:#ffffff;color:#000000"&gt;PctChange = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Math&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Abs(1 - ((d.Value - lr.Value)/lr.Value))&lt;/span&gt;&lt;br&gt;                      &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Select only those that have changed more than 100%&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; changed = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;from&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; c &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; calcStream&lt;/span&gt;&lt;br&gt;               &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;where&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; c.PctChange &amp;gt; 1.0&lt;/span&gt;&lt;br&gt;               &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;select&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; c.Value;&lt;/span&gt;&lt;br&gt; &lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Union first values with changed values &lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; final = firstValues.Union(changed);&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;All that’s left is to bind the output to the subject, creating the feedback loop as well as a console writer sink so that we see results. Then we run the process. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:b162ef00-de50-408c-bbc3-62223b8b0886" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Bind and Run&lt;/div&gt; &lt;div style="background-color: #ffffff; max-height: 400px; overflow: auto; padding: 2px 5px;"&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; sink = cepApplication.DefineObserver(() =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Observer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(&lt;/span&gt;&lt;br&gt;     &lt;span style="background:#ffffff;color:#000000"&gt;e =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;TestEvent ItemId:{&lt;/span&gt;&lt;span style="background:#ffffff;color:#3cb371"&gt;0}&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt; RunNumber:{&lt;/span&gt;&lt;span style="background:#ffffff;color:#3cb371"&gt;1}&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt; Value{&lt;/span&gt;&lt;span style="background:#ffffff;color:#3cb371"&gt;2}&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, e.ItemId, e.RunNumber, e.Value)));&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Bind to subject and console sink so that we see results. &lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Run the process. &lt;/span&gt;&lt;br&gt; &lt;span style="background:#ffffff;color:#000000"&gt;final.Bind(lastReportedSubject).With(final.Bind(sink)).Run();&lt;/span&gt;&lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;I do have to note that when I run this, StreamInsight hangs on shutdown – not a good sign. I’m not exactly sure why this is happening but if I figure it out, I will update this post. Or … if you figure it out, you can send me a note using the “Contact” link on this blog. &lt;/p&gt;  &lt;p&gt;You can download the code from my &lt;a href="http://sdrv.ms/SbtslO" target="_blank"&gt;SkyDrive&lt;/a&gt; (of course!).&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=-QaVndiONyI:tlUzSZdYoVs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=-QaVndiONyI:tlUzSZdYoVs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JdotNet/~4/-QaVndiONyI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/JdotNet/~3/-QaVndiONyI/post.aspx</link>
      <author>jsawyer</author>
      <comments>http://www.devbiker.net/post/Using-Subjects-as-a-e2809cFeedback-Loope2809d.aspx#comment</comments>
      <guid isPermaLink="false">http://www.devbiker.net/post.aspx?id=7d7e6d1c-1cf4-46f5-a3fe-017f435ca725</guid>
      <pubDate>Wed, 12 Dec 2012 10:01:26 -0500</pubDate>
      <dc:publisher>jsawyer</dc:publisher>
      <pingback:server>http://www.devbiker.net/pingback.axd</pingback:server>
      <pingback:target>http://www.devbiker.net/post.aspx?id=7d7e6d1c-1cf4-46f5-a3fe-017f435ca725</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.devbiker.net/trackback.axd?id=7d7e6d1c-1cf4-46f5-a3fe-017f435ca725</trackback:ping>
      <wfw:comment>http://www.devbiker.net/post/Using-Subjects-as-a-e2809cFeedback-Loope2809d.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.devbiker.net/syndication.axd?post=7d7e6d1c-1cf4-46f5-a3fe-017f435ca725</wfw:commentRss>
    <feedburner:origLink>http://www.devbiker.net/post.aspx?id=7d7e6d1c-1cf4-46f5-a3fe-017f435ca725</feedburner:origLink></item>
    <item>
      <title>Dual Mode Data Sources–Part II</title>
      <description>&lt;p&gt;In my previous &lt;a href="http://www.devbiker.net/post/Dual-Mode-Data-Sourcese28093Part-I.aspx" target="_blank"&gt;post&lt;/a&gt;, I walked through creating a basic structure for creating StreamInsight data sources using the Reactive model introduced with version 2.1. There was quite a bit of plumbing work to get done but now that it’s finished, we’re ready to move on to the next step … taking what we just created and making it available to the pre-2.1 API. I didn’t mention this in the previous post but these articles are the first in what’s going to be a series of articles that walk through building a StreamInsight application. In these articles, we’re going through the process to create our data sources – or, more accurately, the architectural framework for our data sources. We’ll do the same with sinks/output adapters and then we’ll start pulling in some real(istic) data and doing something more interesting. Each article will build on the next so you can follow along. &lt;/p&gt;  &lt;p&gt;Now, back to our input. Since we already have the data flowing via the IObservable interface, it’s really easy to subscribe to this interface and implement an input adapter that uses the exact same code to generate events. All we need to do subscribe to our producer and enqueue the event when OnNext is called: &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:e9b86990-8bd6-4c1b-9b4e-854c8ed1d586" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;On Next&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; OnNext(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt; publishedEvent)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (AdapterState == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AdapterState&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Running)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; newEvent = publishedEvent.GetPointEvent();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Enqueue(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;ref&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; newEvent);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;It really is that simple. Well, almost but before we get into that, let’s step back for a second. We have an event producer that creates our events. This producer handles all of the details of connecting to the data source and packaging the data for StreamInsight. Traditionally, we did all of this in the adapter itself but since we’ve already separated it, the adapter really doesn’t need to do much except enqueue. Looking at it that way, why do we need to have separate adapters for each type that we have? Well, the truth is: we don’t. With a little planning, we can have a single set of adapters that subscribe to a producer’s IObservable interface and handle enqueuing the events into StreamInsight as well as manage lifetime. These will be our adapters and they’ll wind up being very thin. So we’ll start by creating a new point typed input adapter. Like the base class, the payload type is a generic argument for the class – there’s no reason why we can’t use this for any type. Because Start() and Resume() are abstract methods on the base class, we have to implement them. We’ll also want to override Stop() and Dispose(bool disposing). &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0641e02e-cfba-4aa8-bb3f-3f7f56d76ba4" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Adapter Skeleton&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ObservableTypedPointInputAdapter&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;:&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TypedPointInputAdapter&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Start()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#00008b"&gt;NotImplementedException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Resume()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#00008b"&gt;NotImplementedException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Stop()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;              &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;base&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Stop();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;protected&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Dispose(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; disposing)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;              &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;base&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Dispose(disposing);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;So let’s get started. First, we need to get our producer. That’s simple enough; we know that we need to have an adapter factory so that’s where we’ll create it and pass it in as an argument of the constructor. We pop this into a private class field – we won’t be calling this until we subscribe. Speaking of subscribe, this is exactly what we need to do in the Start() method. For the producer’s &lt;em&gt;OnCompleted&lt;/em&gt; action, we’ll call the adapter’s &lt;em&gt;Stop()&lt;/em&gt; method. Yes, you can call Stop() in an adapter and not stop the queries that are getting events from the stream – this is something that may happen with a read-once reference data adapter. It’s not commonly seen in the wild but we’ll make sure that we handle it correctly. One thing that is important to understand here … if you are having StreamInsight generate your CTIs for you with AdvanceTimeSettings, one of your options is to &lt;em&gt;AdvanceToInfinityOnShutdown&lt;/em&gt;. This is directly impacted by the adapter calling &lt;em&gt;Stopped()&lt;/em&gt; (or the producer, in fact, calling &lt;em&gt;Complete()&lt;/em&gt;). When the source shuts down, StreamInsight will enqueue a CTI with a timestamp of DateTimeOffset.MaxValue, which serves to “clear” the stream of any pending events. It also happens to work very nicely if you happen to have a read-once data source of reference data. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8b9f593f-d561-46fb-a8a8-e76084ac1d25" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Constructor &amp;amp; Start&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ObservableTypedPointInputAdapter(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObservable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;&amp;gt; eventProducer)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;._eventProducer = eventProducer;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;override&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Start()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;_subscription = _eventProducer.Subscribe(OnNext,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;() =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (AdapterState == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AdapterState&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Running)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                 &lt;span style="background:#ffffff;color:#000000"&gt;Stop();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;             &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;         &lt;span style="background:#ffffff;color:#000000"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;h2&gt;Start vs. Resume&lt;/h2&gt;  &lt;p&gt;In a lot of the samples, you’ll see these implemented the exact same way. However, in the real world, you may want to put a little more thought into how you handle &lt;em&gt;Resume().&lt;/em&gt; Odds are pretty good, especially if you are using Premium Edition, that you will never need to actually implement &lt;em&gt;Resume()&lt;/em&gt;. It gets called after your adapter is put into a suspended state because the input queue is full. Yes, it is possible to fill up the input queue – you need about 200,000 unprocessed events that StreamInsight can’t get pushed through your queries. I have made this happen – but it took some effort. I actually had to continue enqueueing events just as fast as I could on multiple threads. Even with some convoluted queries, it still took about some time to fill up the input queue. Considering that I’ve seen StreamInsight process over 30,000 events/sec on a dual core i7 &lt;em&gt;laptop &lt;/em&gt;and over 100,000 events/sec on a low-to-mid level server &lt;em&gt;with CPU cycles to spare&lt;/em&gt;, you will have to work at it. &lt;em&gt;But it can happen&lt;/em&gt;. Now, if you are using Standard Edition, you won’t be able to get to that level of throughput (and I haven’t done any testing on Standard’s throughput) but you can still expect to push a goodly number of events through standard edition. Now, when the input queue fills up, StreamInsight will return &lt;strong&gt;Full&lt;/strong&gt; from the enqueue. Your adapter will need to call Ready() and then StreamInsight will call &lt;em&gt;Resume()&lt;/em&gt; when you can start enqueuing events again. If you are using the StreamInsight 2.1 Reactive model, &lt;em&gt;you won’t get any notification if the input queue fills&lt;/em&gt;. Instead, StreamInsight will simply ignore your events until it’s ready to receive events again. This is what I’m going to do in our excercises but it may not be appropriate, depending on your source and your needs. For example, if you are simply pushing recorded data through the engine, it would be easy enough to pause and then start back up again when Resume() is called. If, however, it’s live data, you may need to do something else. You will want to exercise some caution in buffering up events that you miss – you have no way of knowing when the adapter will start back up again and you could eat up FAR more memory than you want to. It is a potentially difficult issue but, fortunately, one that is pretty tough to hit in the real world. Especially if you are using Premium Edition, you’ll saturate network bandwidth (for inbound data) before you fill up the queue. In our exercise, we’re going to do the same thing that StreamInsight 2.1 does … we’re just going to ignore incoming events until Resume() is called.&lt;/p&gt;  &lt;p&gt;&lt;font color="#333333" face="Verdana"&gt;Back to the code … in the snippet above, I enqueued directly from the OnNext function. While this works – if everything goes right – it doesn’t really represent what we’ll need to do in a real app to handle things like exceptions, queue full and the like. Also, while this class is designed to be a stand-alone input adapter than can be used with &lt;em&gt;any&lt;/em&gt; observable source, there may be special case adapters – for example, specific handling of a pause/resume scenario – where we want to override specific behaviors with an inherited class so we want to make sure that we provide the right level of points to override. So we’ll take the enqueue operation and create our own method. In here, we do all of our state checks to make sure that we &lt;em&gt;can&lt;/em&gt; enqueue, handle enqueue exceptions and queue full as well as keep track of our last-enqueued CTI. Finally, we will also include a critical section lock around the actual enqueue to make sure that we handline lifetime correctly and don’t report Stopped() when we’re in the middle of an enqueue. It is the same method described in my previous article on &lt;a href="http://www.devbiker.net/post/StreamInsight-Output-Adapter-Lifetime.aspx" target="_blank"&gt;output adapter lifetime&lt;/a&gt; but applied to input adapters. &lt;/font&gt;&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:de5b408c-8c35-4dd8-84b1-2b9594a5f19a" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Enqueue Event&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;protected&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;virtual&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; EnqueueEvent(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt; publishedEvent)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (!_canEnqueue) &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (publishedEvent.Start &amp;lt; _lastCti)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;lock&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (_lockObject)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.AdapterState != &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AdapterState&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Running)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; point = publishedEvent.GetPointEvent();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;try&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; enqueueResult = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Enqueue(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;ref&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; point);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (enqueueResult == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EnqueueOperationResult&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Success &amp;amp;&amp;amp; publishedEvent.EventKind == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventKind&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Cti)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;_lastCti = point.StartTime;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (enqueueResult == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EnqueueOperationResult&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Full)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Queue full!! Pause enqueuing. &lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;_canEnqueue = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;ReleaseEvent(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;ref&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; point);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Let StreamInsight know we&amp;#39;re ready to resume. &lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;Ready(); &lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;catch&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;ReleaseEvent(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;ref&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; point);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Our last step is to create our adapter factory. In our Create method, we’ll do a couple of checks to make sure that our arguments are valid – the payload is the proper type and, since our random data source only supports points, that we are implementing the correct shape.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:805aca99-4883-4194-a61e-7ea52330b9bc" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Input Adapter Factory&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;sealed&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; : &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ITypedInputAdapterFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;SuppressMessage&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Microsoft.Design&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;CA1004:GenericMethodsShouldProvideTypeParameter&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, Justification = &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;By Design&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;InputAdapterBase&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Create &amp;lt;TPayload&amp;gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; configInfo, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventShape)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(TPayload) != &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;))&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//this won&amp;#39;t work. &lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//throw an exception. &lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;InvalidOperationException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Specified type must be of &amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; + &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;).FullName); &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;switch&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (eventShape)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;case&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Point:&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Create the publisher. &lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ObservableTypedPointInputAdapter&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataProducer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(configInfo)); &lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;default&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;:&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ArgumentException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Format(&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;System.Globalization.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;CultureInfo&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.InvariantCulture,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;TestDataInputFactory cannot instantiate adapter with event shape {&lt;/span&gt;&lt;span style="background:#ffffff;color:#3cb371"&gt;0}&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;eventShape.ToString()));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Dispose method.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Dispose()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Once we have the adapter factory, we’re ready to go. Because we’ve not done any output adapters yet, we’ll be using the ToPointObservable() method to write to the console. Keep in mind that this works only when hosting StreamInsight in-process; it’s not at all like the IObservable support in 2.1. But it works well enough to show that we have some data flowing through and that our adapter now supports &lt;em&gt;both&lt;/em&gt; models from the same data producer! &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:d0c25b79-9c9d-4f14-8895-4eebf2d06840" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Run Query&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; RunQuery(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Application&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; cepApplication)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;NumberOfItems = 20,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;RefreshInterval = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TimeSpan&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.FromMilliseconds(500)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; data = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;CepStream&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;.Create(cepApplication, &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;TestData&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;typeof&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputFactory&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;), config, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Point);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; observable = data.ToPointObservable().Subscribe(&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;e =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (e.EventKind == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventKind&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Insert)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;TestEvent ItemId:{&lt;/span&gt;&lt;span style="background:#ffffff;color:#3cb371"&gt;0}&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt; Run:{&lt;/span&gt;&lt;span style="background:#ffffff;color:#3cb371"&gt;1}&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt; Value{&lt;/span&gt;&lt;span style="background:#ffffff;color:#3cb371"&gt;2}&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                      &lt;span style="background:#ffffff;color:#000000"&gt;e.Payload.ItemId, e.Payload.RunNumber, e.Payload.Value);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Console&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;CTI @ {&lt;/span&gt;&lt;span style="background:#ffffff;color:#3cb371"&gt;0}&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, e.StartTime);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Using the same pattern, we can also create the adapters for interval and edge events pretty quickly. Unfortunately, a lot of it is copy-paste-tweak. I say unfortunately because it leads to a lot of redundant and repetitive code that I, for one, would prefer to create and maintain in a single place. However, our key method – enqueue – isn’t defined in any common base class; we have to inherit from the shape-specific adapters and there’s no way around it. While we &lt;em&gt;could&lt;/em&gt; probably deal with this with another layer of abstraction, there isn’t, IMHO, a whole lot of value to that. Should that change, we’ll take a look at refactoring a bit then. &lt;/p&gt;  &lt;p&gt;Looking at the input adapter factory, you’ll notice that it does some checking to make sure things are valid before creation; factories are good for that. There’s a bunch of other stuff that &lt;em&gt;could&lt;/em&gt; be done in the factory as well and having a standard, generic factory interface is a good way to provide yourself with a clean, clear and decoupled way to create what may be complex underlying objects. And there’s no reason why we can’t revisit our existing 2.1-based code to add the factory in there. It also provides a level of consistency between the two different APIs that can make our life simpler, reduce the amount of debugging that we need to do and promote code sharing. That, however, will have to wait for the next post – I am trying to do this in manageable pieces so I’m not writing a novel with each post. In the meantime, you can download the current project from my &lt;a href="https://skydrive.live.com/redir?resid=E45DFECBE9DCC432!605&amp;amp;authkey=!AI1Y5Oq9_OsgHWk" target="_blank"&gt;SkyDrive&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=EYzth_rgqnw:TAl9J7xGhUA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=EYzth_rgqnw:TAl9J7xGhUA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JdotNet/~4/EYzth_rgqnw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/JdotNet/~3/EYzth_rgqnw/post.aspx</link>
      <author>jsawyer</author>
      <comments>http://www.devbiker.net/post/Dual-Mode-Data-Sourcese28093Part-II.aspx#comment</comments>
      <guid isPermaLink="false">http://www.devbiker.net/post.aspx?id=bfee7321-0e80-4451-a258-59c2e4a657b7</guid>
      <pubDate>Tue, 11 Dec 2012 21:11:07 -0500</pubDate>
      <category>Code Sample</category>
      <category>StreamInsight</category>
      <dc:publisher>jsawyer</dc:publisher>
      <pingback:server>http://www.devbiker.net/pingback.axd</pingback:server>
      <pingback:target>http://www.devbiker.net/post.aspx?id=bfee7321-0e80-4451-a258-59c2e4a657b7</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.devbiker.net/trackback.axd?id=bfee7321-0e80-4451-a258-59c2e4a657b7</trackback:ping>
      <wfw:comment>http://www.devbiker.net/post/Dual-Mode-Data-Sourcese28093Part-II.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.devbiker.net/syndication.axd?post=bfee7321-0e80-4451-a258-59c2e4a657b7</wfw:commentRss>
    <feedburner:origLink>http://www.devbiker.net/post.aspx?id=bfee7321-0e80-4451-a258-59c2e4a657b7</feedburner:origLink></item>
    <item>
      <title>Dual Mode Data Sources–Part I</title>
      <description>&lt;p&gt;When StreamInsight 2.1 came out, the Big New Thing for the release was the new model for data ingress and egress – sources and sinks. Based on standard interfaces like IObservable and IObserver and the Reactive Extensions, it makes getting data into and out of StreamInsight a whole lot easier. The previous model works (or worked) well enough but, honestly, it was &lt;em&gt;hard … &lt;/em&gt;and harder than it really needed to be. Getting the adapter lifetime just right was not a trivial undertaking and getting wrong meant either hanging on shutdown or an ObjectDisposedException. It took me … and my team … some time to get all of this nailed down to a science. The new model handles all of this for you … you just subscribe and publish. The rest is invisible. Very nice.&lt;/p&gt;  &lt;p&gt;But, as when any new API replaces an old API, there is a time of transition from one to the other. There’s a time when developers or solution providers – like me – need to be able to support both APIs. For us, we actually still (sadly) need to support StreamInsight 1.2 and 2.0 in some cases so we can’t go over to the new model. But we also don’t want to rewrite all of our adapters or maintain two codebases of adapters. Instead, we want to support both from a single code base. Fortunately, this is actually pretty easy to accomplish with a little planning and good architectural practices. I’ll walk you through this – in it’s simplest form – and this code will also be the base for a line of additional articles that I’ve been working on and have planned. In fact, I plan to walk through creating a StreamInsight application step by step and discussing the technical details as we go so, by the end, you’ll have walked with me to build a simple StreamInsight application. &lt;/p&gt;  &lt;p&gt;Oh … and let me make one thing clear though. I’ve heard it said (from Microsoft field technical sales-type folks) that “you don’t have to write adapters anymore.” That’s not &lt;em&gt;entirely&lt;/em&gt; accurate. You don’t have to use the “legacy” adapter API anymore. But you will have to write code to get data in to and out of StreamInsight. You may use a different API now (IObserver/IObservable) but the necessity of writing code for this task is still there. Call it what you want ‘cuz now we’re just arguing semantics.&lt;/p&gt;  &lt;h2&gt;Sources/Input Adapters&lt;/h2&gt;  &lt;p&gt;Source is the new name for input adapter. With StreamInsight 2.1, you’ll want to implement IObservable. I won’t go over the basics; you’ll find them in the &lt;a href="http://msdn.microsoft.com/en-us/library/gg144958(v=sql.111).aspx" target="_blank"&gt;documentation&lt;/a&gt;. But there are some things that you need to consider that aren’t in the documentation. First … CTI's (and I’ll be talking more about these in a future post or two). While you can use AdvanceTimeSettings to have StreamInsight generate your CTIs for you, this isn’t always appropriate to do. So we need to have a way to have CTIs created and enqueued by the adapters … and it needs to be optional. So we’ll start with an wrapper class that allows a data source to create both events (with payloads) and CTIs. This will be our &lt;em&gt;StreamInputEvent&lt;/em&gt; class. It will have all of the appropriate temporal properties and event shape metadata as well as the payload. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0ff026ea-b697-4500-b08c-e3560f5d8f8e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;StreamInputEvent&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&amp;lt;TPayloadType&amp;gt;&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; TPayloadType Payload { &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DateTimeOffset&lt;/span&gt; Start{ &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DateTimeOffset&lt;/span&gt; End{ &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;EdgeType&lt;/span&gt; EdgeType{ &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;EventKind&lt;/span&gt; EventKind{ &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;We’ll also add some helper methods to create the different event shapes as well as a constructor or two: &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:ebe5426e-368c-4e46-a726-39b0121cf8a1" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Helpers &amp;amp; Constructors&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;PointEvent&lt;/span&gt;&amp;lt;TPayloadType&amp;gt; GetPointEvent()&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.EventKind == &lt;span style="color:#2b91af"&gt;EventKind&lt;/span&gt;.Insert)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af"&gt;PointEvent&lt;/span&gt;&amp;lt;TPayloadType&amp;gt;.CreateInsert(&lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.Start, Payload);&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#2b91af"&gt;PointEvent&lt;/span&gt;&amp;lt;TPayloadType&amp;gt;.CreateCti(Start);&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#008000"&gt;//More helpers for Edge and Interval&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; StreamInputEvent(&lt;span style="color:#2b91af"&gt;DateTimeOffset&lt;/span&gt; ctiDateTime)&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li&gt;    EventKind = &lt;span style="color:#2b91af"&gt;EventKind&lt;/span&gt;.Cti; &lt;/li&gt; &lt;li&gt;    Start = ctiDateTime;&lt;/li&gt; &lt;li&gt;    EdgeType = &lt;span style="color:#2b91af"&gt;EdgeType&lt;/span&gt;.Start;&lt;/li&gt; &lt;li&gt;    End = &lt;span style="color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;.MaxValue;&lt;/li&gt; &lt;li&gt;    Payload = &lt;span style="color:#0000ff"&gt;default&lt;/span&gt;(TPayloadType);&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; StreamInputEvent(TPayloadType payload)&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li&gt;    Start = &lt;span style="color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;.MinValue;&lt;/li&gt; &lt;li&gt;    End = &lt;span style="color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;.MaxValue;&lt;/li&gt; &lt;li&gt;    EdgeType = &lt;span style="color:#0000ff"&gt;default&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;EdgeType&lt;/span&gt;);&lt;/li&gt; &lt;li&gt;    Payload = payload;&lt;/li&gt; &lt;li&gt;    EventKind = &lt;span style="color:#2b91af"&gt;EventKind&lt;/span&gt;.Insert;&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; StreamInputEvent(TPayloadType payload, &lt;span style="color:#2b91af"&gt;DateTimeOffset&lt;/span&gt; startTime, &lt;span style="color:#2b91af"&gt;DateTimeOffset&lt;/span&gt; endTime, &lt;span style="color:#2b91af"&gt;EdgeType&lt;/span&gt; edgeType)&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li&gt;    Start = startTime;&lt;/li&gt; &lt;li&gt;    End = endTime;&lt;/li&gt; &lt;li&gt;    EdgeType = edgeType;&lt;/li&gt; &lt;li&gt;    Payload = payload;&lt;/li&gt; &lt;li&gt;    EventKind = &lt;span style="color:#2b91af"&gt;EventKind&lt;/span&gt;.Insert;&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Now, you’ll note that there isn’t an EventShape specified. The shape can be determined from the event times and we’ve found it useful to have data sources that can adapter to whatever shape we deem fit for a particular use case. But we’ll still have a factory (regardless of how we do it) that allows us to limit a particular data source to specific shapes. And the helpers make it really, really easy when we create the IQStreamable for the temporal processing. &lt;/p&gt;  &lt;p&gt;Now that we have that done, let’s take a step back and look at this. We have a data source of some type and we need to get the data into StreamInsight. The wonderful thing about StreamInsight 2.1’s focus on IObservable is that he lets use really step back for a second and look at how we produce data. In fact, it allows use to “hide” our producers behind a standard interface … and that’s what we need to do. At the lowest level, the code closest to the data source, we’ll create a “data producer” that takes the data and publishes it via IObservable – so there’s our ‘native’ 2.1 interface. To support the legacy adapter model, we will just need to subscribe to this with the concrete Input Adapter class.&lt;/p&gt;  &lt;p&gt;So let’s get started by creating a base EventProducer class to handle subscribers and disposal. We’ll also need to make sure that we can specify the configuration for the event producer – just like we were forced to do with the legacy adapter model. The reality is simple … unless you are doing a really, incredibly simple demo, you need to have a way to specify configuration. Having a configuration class that is passed to the event producer from the application just makes sense. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5a5ca0b2-4923-4e63-8c25-ae17cc94c82d" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;StreamEventProducer&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;StreamEventProducer&lt;/span&gt;&amp;lt;TPayloadType, TConfigType&amp;gt;&lt;/li&gt; &lt;li&gt;    : &lt;span style="color:#2b91af"&gt;IObservable&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&amp;lt;TPayloadType&amp;gt;&amp;gt;, &lt;span style="color:#2b91af"&gt;IDisposable&lt;/span&gt;&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; TConfigType Configuration { &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; EventProducerBase(TConfigType configuration)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.Configuration = configuration;&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;abstract&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; Start();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IObserver&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&amp;lt;TPayloadType&amp;gt;&amp;gt; _observer;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;virtual&lt;/span&gt; &lt;span style="color:#2b91af"&gt;IDisposable&lt;/span&gt; Subscribe(&lt;span style="color:#2b91af"&gt;IObserver&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&amp;lt;TPayloadType&amp;gt;&amp;gt; observer)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;._observer = observer;&lt;/li&gt; &lt;li&gt;        Start();&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; PublishException(&lt;span style="color:#2b91af"&gt;Exception&lt;/span&gt; ex)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li&gt;        _observer.OnError(ex);&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; PublishEvent(&lt;span style="color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&amp;lt;TPayloadType&amp;gt; newEvent)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li&gt;        _observer.OnNext(newEvent);&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;virtual&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; Dispose(&lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; disposing)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (disposing)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li&gt;            _observer.OnCompleted();&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;If you look at this, you’ll see that it’s pretty simple. You can certainly get more sophisticated with this - by supporting multiple observers to share event producers between multiple sources and/or adapters – but I want to keep it simple and clear. Our concrete event producer will inherit from this class, implement Start() (called when a subscriber actually subscribes) and call the PublishException and PublishEvent as appropriate. Our event producer will also need want to override Dispose(bool disposing) to get notification if when it’s time to shut down. &lt;/p&gt;  &lt;p&gt;So let’s go ahead now and create our first event producer. For our sample here, it will be a very simple random data generator because, of course, everyone needs to analyze completely random data in StreamInsight. Well, no of course not, but it’s easy and simple. We’ll start with the configuration class.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:6bd5c7a7-0a32-4cae-b3e6-500785a32d50" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;TestDataInputConfig&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;[&lt;span style="color:#2b91af"&gt;DataContract&lt;/span&gt;()]&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; TestDataInputConfig()&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li&gt;        RefreshInterval = &lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt;.FromMilliseconds(500);&lt;/li&gt; &lt;li&gt;        NumberOfItems = 10;&lt;/li&gt; &lt;li&gt;        TimestampIncrement = &lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt;.FromMinutes(5);&lt;/li&gt; &lt;li&gt;        StartDateTime = &lt;span style="color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;.Now.AddMonths(-5);&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    [&lt;span style="color:#2b91af"&gt;DataMember&lt;/span&gt;]&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DateTimeOffset&lt;/span&gt; StartDateTime { &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    [&lt;span style="color:#2b91af"&gt;DataMember&lt;/span&gt;]&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt; RefreshInterval { &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    [&lt;span style="color:#2b91af"&gt;DataMember&lt;/span&gt;]&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt; TimestampIncrement { &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    [&lt;span style="color:#2b91af"&gt;DataMember&lt;/span&gt;]&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; NumberOfItems { &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;    &lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Note that it is marked as DataContract and each property is marked with the DataMember attribute … this is very important. The configuration classes may – and probably &lt;em&gt;will&lt;/em&gt; - end up being serialized. This was also true in the adapter model; all of your configuration classes need to be able to be serialized. Now you &lt;em&gt;can&lt;/em&gt; also use Serializable() but I’ve found that, at times, the C# compiler goes somewhat insane when you do that and you get exceptions when serializing the configuration classes. Now for our payload class. We have an ItemId and a Value of type double and, since this class is for testing and we want to be able to “see” what’s going on (and for other reasons), we also have some properties on here to help with that – RunNumber (which generation “run” created it) and EnqueueTimestamp (the time it was actually created, which may be different from the event’s start time). Finally, we also have a static helper method that’ll create a bunch of these test events for enqueuing for the “run”.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:360af0d9-2844-479b-afd7-e0f7ae619391" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;TestDataEvent&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;/li&gt; &lt;li&gt;{&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Random&lt;/span&gt; rdm = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Random&lt;/span&gt;(); &lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&amp;gt; CreateNext(&lt;span style="color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt; config, &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; runNumber)&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&amp;gt; newReferenceData =&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&amp;gt;(config.NumberOfItems);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;for&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;int&lt;/span&gt; i = 0; i &amp;lt; config.NumberOfItems; i++)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li&gt;            newReferenceData.Add(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TestDataEvent&lt;/span&gt;()&lt;/li&gt; &lt;li&gt;                    {&lt;/li&gt; &lt;li&gt;                        ItemId = &lt;span style="color:#a31515"&gt;&amp;quot;Item&amp;quot;&lt;/span&gt; + i.ToString(),&lt;/li&gt; &lt;li&gt;                        RunNumber = runNumber, &lt;/li&gt; &lt;li&gt;                        EnqueueTimestamp = &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt;.Now, &lt;/li&gt; &lt;li&gt;                        Value = rdm.NextDouble() * 10&lt;/li&gt; &lt;li&gt;                    });&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li&gt;        &lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;return&lt;/span&gt; newReferenceData; &lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;string&lt;/span&gt; ItemId { &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; RunNumber { &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DateTime&lt;/span&gt; EnqueueTimestamp { &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;    &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;double&lt;/span&gt; Value { &lt;span style="color:#0000ff"&gt;get&lt;/span&gt;; &lt;span style="color:#0000ff"&gt;set&lt;/span&gt;; }&lt;/li&gt; &lt;li&gt;}&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;Now that we have all of the foundational building blocks completed, we are finally ready to create our producer. For now, we’ll have our producer enqueue the CTIs after each “batch” of events; this keeps all of the events in the same “run” within the same CTI &lt;em&gt;span&lt;/em&gt;. &lt;/p&gt;    &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:a50827ba-21ca-4c1b-863c-33ca806ac14c" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;TestDataEventProducer&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff"&gt;class&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TestDataProducer&lt;/span&gt; : &lt;span style="color:#2b91af"&gt;StreamEventProducer&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;TestDataEvent&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&amp;gt;&lt;/li&gt; &lt;li&gt;    {&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af"&gt;DateTimeOffset&lt;/span&gt; _nextStartTime;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Timer&lt;/span&gt; _enqueueTimer;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;int&lt;/span&gt; _runNumber = 0;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;public&lt;/span&gt; TestDataProducer(&lt;span style="color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt; config): &lt;span style="color:#0000ff"&gt;base&lt;/span&gt;(config)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li&gt;            _enqueueTimer = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;Timer&lt;/span&gt;(ProduceEvents, &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;, &lt;span style="color:#2b91af"&gt;Timeout&lt;/span&gt;.Infinite, &lt;span style="color:#2b91af"&gt;Timeout&lt;/span&gt;.Infinite);&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;._nextStartTime = config.StartDateTime;&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; Start()&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#008000"&gt;// Change the timer to start it.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            _enqueueTimer.Change(&lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt;.Zero, Configuration.RefreshInterval);&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#808080"&gt;///&lt;/span&gt;&lt;span style="color:#008000"&gt; &lt;/span&gt;&lt;span style="color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#808080"&gt;///&lt;/span&gt;&lt;span style="color:#008000"&gt; Main driver to read events from source and enqueue them.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#808080"&gt;///&lt;/span&gt;&lt;span style="color:#008000"&gt; &lt;/span&gt;&lt;span style="color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; ProduceEvents(&lt;span style="color:#0000ff"&gt;object&lt;/span&gt; state)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li&gt;            _runNumber++;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; newEvents =&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#2b91af"&gt;TestDataEvent&lt;/span&gt;.CreateNext(Configuration, _runNumber);&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; eventTimestamp =  _nextStartTime;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;var&lt;/span&gt; publishEvents = (&lt;span style="color:#0000ff"&gt;from&lt;/span&gt; e &lt;span style="color:#0000ff"&gt;in&lt;/span&gt; newEvents&lt;/li&gt; &lt;li&gt;                                 &lt;span style="color:#0000ff"&gt;select&lt;/span&gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&amp;gt;(e)&lt;/li&gt; &lt;li&gt;                                            {&lt;/li&gt; &lt;li&gt;                                                Start = eventTimestamp&lt;/li&gt; &lt;li&gt;                                            }).ToList();&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;foreach&lt;/span&gt; (&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; publishedEvent &lt;span style="color:#0000ff"&gt;in&lt;/span&gt; publishEvents)&lt;/li&gt; &lt;li&gt;            {&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.PublishEvent(publishedEvent); &lt;/li&gt; &lt;li&gt;            }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#008000"&gt;//Enqueue our CTI&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;this&lt;/span&gt;.PublishEvent(&lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;StreamInputEvent&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&amp;gt;(eventTimestamp.AddTicks(1)));&lt;/li&gt; &lt;li&gt;            _nextStartTime += Configuration.TimestampIncrement; &lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="color:#0000ff"&gt;protected&lt;/span&gt; &lt;span style="color:#0000ff"&gt;override&lt;/span&gt; &lt;span style="color:#0000ff"&gt;void&lt;/span&gt; Dispose(&lt;span style="color:#0000ff"&gt;bool&lt;/span&gt; disposing)&lt;/li&gt; &lt;li&gt;        {&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (disposing)&lt;/li&gt; &lt;li&gt;            {&lt;/li&gt; &lt;li&gt;                &lt;span style="color:#0000ff"&gt;if&lt;/span&gt; (_enqueueTimer != &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;)&lt;/li&gt; &lt;li&gt;                {&lt;/li&gt; &lt;li&gt;                    _enqueueTimer.Dispose();&lt;/li&gt; &lt;li&gt;                    _enqueueTimer = &lt;span style="color:#0000ff"&gt;null&lt;/span&gt;;&lt;/li&gt; &lt;li&gt;                }&lt;/li&gt; &lt;li&gt;            }&lt;/li&gt; &lt;li&gt;            &lt;span style="color:#0000ff"&gt;base&lt;/span&gt;.Dispose(disposing); &lt;/li&gt; &lt;li&gt;        }&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    }&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;    &lt;p&gt;At this point, we are actually ready to start using the StreamInsight 2.1 APIs to get data from our new producer! Of course, we aren’t done but let’s see how we could do this. It’s there that the GetPointEvent() helper method is really, really handy. It makes the code very readable and it happens to be highly reusable as well, both of which are Very Good Things™. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:5ef94fae-60d2-4f48-809c-a9fc6c35fa18" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Running the Process ...&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; config = &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt; (){&lt;/li&gt; &lt;li&gt;    NumberOfItems=20, &lt;/li&gt; &lt;li&gt;    RefreshInterval=&lt;span style="color:#2b91af"&gt;TimeSpan&lt;/span&gt;.FromMilliseconds(500)&lt;/li&gt; &lt;li&gt;};&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; data = cepApplication.DefineObservable(&lt;/li&gt; &lt;li&gt;    () =&amp;gt; &lt;span style="color:#0000ff"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af"&gt;TestDataProducer&lt;/span&gt;(config)).ToPointStreamable(e =&amp;gt; e.GetPointEvent());&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="color:#0000ff"&gt;var&lt;/span&gt; sink = cepApplication.DefineObserver(() =&amp;gt; &lt;span style="color:#2b91af"&gt;Observer&lt;/span&gt;.Create&amp;lt;&lt;span style="color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&amp;gt;(&lt;/li&gt; &lt;li&gt;    e =&amp;gt; &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;&amp;quot;TestEvent ItemId:{&lt;/span&gt;&lt;span style="color:#3cb371"&gt;0}&lt;/span&gt;&lt;span style="color:#a31515"&gt; Run:{&lt;/span&gt;&lt;span style="color:#3cb371"&gt;1}&lt;/span&gt;&lt;span style="color:#a31515"&gt; Value{&lt;/span&gt;&lt;span style="color:#3cb371"&gt;2}&lt;/span&gt;&lt;span style="color:#a31515"&gt;&amp;quot;&lt;/span&gt;, e.ItemId, e.RunNumber, e.Value)));&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;data.Bind(sink).Run();&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;And when we do that, we get our data flowing. You can download the code from my &lt;a href="https://skydrive.live.com/redir?resid=E45DFECBE9DCC432!604&amp;amp;authkey=!AClKdul_-AQqbFc" target="_blank"&gt;SkyDrive&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=8PP_rz7mYJU:IE25NHDKwUU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=8PP_rz7mYJU:IE25NHDKwUU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JdotNet/~4/8PP_rz7mYJU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/JdotNet/~3/8PP_rz7mYJU/post.aspx</link>
      <author>jsawyer</author>
      <comments>http://www.devbiker.net/post/Dual-Mode-Data-Sourcese28093Part-I.aspx#comment</comments>
      <guid isPermaLink="false">http://www.devbiker.net/post.aspx?id=c930c648-b6c3-4f30-bba2-56d0da9cb039</guid>
      <pubDate>Fri, 07 Dec 2012 18:47:56 -0500</pubDate>
      <category>Code Sample</category>
      <category>StreamInsight</category>
      <dc:publisher>jsawyer</dc:publisher>
      <pingback:server>http://www.devbiker.net/pingback.axd</pingback:server>
      <pingback:target>http://www.devbiker.net/post.aspx?id=c930c648-b6c3-4f30-bba2-56d0da9cb039</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.devbiker.net/trackback.axd?id=c930c648-b6c3-4f30-bba2-56d0da9cb039</trackback:ping>
      <wfw:comment>http://www.devbiker.net/post/Dual-Mode-Data-Sourcese28093Part-I.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.devbiker.net/syndication.axd?post=c930c648-b6c3-4f30-bba2-56d0da9cb039</wfw:commentRss>
    <feedburner:origLink>http://www.devbiker.net/post.aspx?id=c930c648-b6c3-4f30-bba2-56d0da9cb039</feedburner:origLink></item>
    <item>
      <title>Where does StreamInsight data come from?</title>
      <description>&lt;p&gt;I got this question at Sql Saturday BI Edition in Dallas not too long ago. My answer was the usual one … “Well, you write an input adapter or (in 2.1) a source in .NET …”.&amp;#160; “Yes, I know that,” the asker replied, “but where does it come &lt;em&gt;from&lt;/em&gt;?” “Ummm …” I was getting a little flustered. “Anything you can get to with .NET.” “You aren’t helping,” he replied … and proceeded to tell me that I’m giving him the same answer that everyone has given him and it’s not really an answer. Now, this wasn’t just some muffin-eater that you see at free conferences sometimes where you find yourself wondering if they should be allowed to use a computer at all. No, it came from fellow MVP and Microsoft Certified Master Sean McCown of &lt;a href="http://midnightdba.itbookworm.com/" target="_blank"&gt;Midnight DBA&lt;/a&gt; fame. I’d sat in on Sean’s sessions before and knew that he was a little smarter (at least) than your average bear. So I knew I was missing something. I scratched my head. And then went into a discussion … and whiteboarding … of how OSISoft’s PI System Adapters work. &lt;/p&gt;  &lt;p&gt;It’s been some time since then and I’ve been meaning to write this follow up. You see, it finally dawned on me as Sean was ranting about the answer not being an answer that, well, it wasn’t really an answer. The whole getting-data-to-StreamInsight thing has been something like the Underwear Gnomes from South Park. Step 1: Get Data Source. Step 2 … … … Step 3: Write Adapter! What’s missing is step 2 … how does the data get from your data source into the adapter/source code. In reality, it does vary pretty widely, depending on what your data source is. &lt;/p&gt;  &lt;h2&gt;Determining the Data You Want&lt;/h2&gt;  &lt;p&gt;Your first step is to determine the data that you want to get into StreamInsight. You’ll have two primary types of data: fast, stream data for analysis and slow-moving, reference data. For your stream data, you will typically want to get it as close to the original source of this data as possible – within reason. As we get further into this, it’ll make more sense what I’m talking about here. You also want to keep this data as lightweight as possible. There’s no point in sending extra bits over the wire that you really don’t need &lt;em&gt;with every update&lt;/em&gt;. Other data, the stuff that doesn’t change (for example, with a pressure sensor you may have units of measure, device type, subsystem, etc.) is reference data. You’ll still need it but you won’t want it with every single individual update. Depending on the data rates and the number of individual data points that you want, it’s entirely conceivable that you’ll run out of network bandwidth before you run out of StreamInsight processing power. You’ll also want to have a minimum number of sources/input adapters as possible so if you can get reading from multiple items/devices in a single adapter, all the better. &lt;/p&gt;  &lt;p&gt;With that said, let’s talk about some of the options for data sources. &lt;/p&gt;  &lt;h2&gt;Raw Device Connections &lt;/h2&gt;  &lt;p&gt;Yup, you can do this. Well … as long as you have a way to get to it. Connecting directly to the device will be the fastest way to get the highest speed data possible. Now, exactly &lt;em&gt;how&lt;/em&gt; you do that depends on the device. Some process control system sensors will transmit over dedicated and special-purpose protocols like Modbus or Profibus. They may ride on TCP, UDP, serial ports or even dedicated network connection require special hardware. Or you may have a completely custom and proprietary protocol. At any rate, you’re getting data direct from the device in its most raw form. Depending on the device and its capabilities, this may be a push or it may be a poll. And, as a result, you’ll need to take the bytes off the wire and deserialize them into events for StreamInsight. Let me give you an example of something that we’re currently working on. In this system, we’re actually getting data from building sensors via a push … things like fire alarms and door access devices. There is a common protocol for these devices but it’s all binary. The first byte gives you a header that tells you what kind of message it is and a timestamp. From there, you can determine how to read the rest of the bytes. The structure is documented and it’s a matter of taking the bytes, rearranging them and then enqueuing them. It’s not hard but it is tedious and you really have to pay attention to little details since you don’t have a nice object API to work with. &lt;/p&gt;  &lt;h2&gt;Device Aggregation Systems With “Push”&lt;/h2&gt;  &lt;p&gt;No, that’s not the formal name but it’s about the best “bucket” that I can come up with. Again, this covers a wide variety of types of systems that will aggregate raw device signals and then provide notifications of updates. It’s a layer above the raw device connection so you’ll lose a little bit of latency but the advantages are huge. Since you can aggregate multiple devices into a single connection, you minimize the number of adapters that you need to have running at any one time. Nor will you have to worry about fiddling with byte arrays and deserializing them into usable data – these systems will have APIs that do a lot of the heavy lifting for you. I’d put things like OPC and OSISoft’s PI Adapters for StreamInsight into this bucket. OPC has the advantange of being very widely deployed and accepted. Unfortunately, the most common implementation is the (very) old OPC-DA, which is based on (the horror!) DCOM. However … it does work very well. With OPC-DA, you create a connection to the OPC DCOM server and then subscribe for callbacks via old school COM events. As new readings come in, the OPC server sends your adapter/source the updates, which are then enqueued. OSISoft’s PI Adapters are similar except they are all .NET. Now … if you are familiar with PI, you also know that it’s a historian – it stores event data long-term and, to do this efficiently uses compression algorithms that amount to downsampling. (You can, in fact, use OLEDB to get to the PI archive for historical data.) However, the adapters don’t read from the archive. As the data comes into PI from the individual sensors, it goes into the &lt;em&gt;Snapshot&lt;/em&gt;. Every bit of data that the PI Server gets goes into the Snapshot, whether it’s actually stored or not. It’s after the Snapshot that it goes into the compression algorithms for efficient storage. The PI adapters connect to the Snapshot and register for notifications; as data comes into PI and goes into the Snapshot, it is then sent to the input adapter and then to StreamInsight.&lt;/p&gt;  &lt;h2&gt;Polling a Store (Store-And-Forward)&lt;/h2&gt;  &lt;p&gt;You don’t want to do this if you can avoid it. But you can’t always avoid it. Sometimes you will want to sit alongside an existing system that collects data in a database and analyze it with StreamInsight temporal operators or correlate it with other real-time events. Sometimes the architecture and nature of the systems involved really require this. Standards like WITSML and PRODML come to mind what mentioning this. You will want to balance the amount of polling that you do with your latency requirements and you’ll have to keep in mind that there will be latency involved. As with other data, you want to only get the least amount of data so your source will need to have some way for you to select all since last poll. It’s actually the easiest to do but the least desirable from a StreamInsight perspective. SQL Server Service Broker is one area that may make some of this a little better from a Sql Server perspective and one that, honestly, I need to really spend some time looking at. &lt;/p&gt;  &lt;h2&gt;Reference Data&lt;/h2&gt;  &lt;p&gt;Your reference data is going to come from some sort of durable store like Sql Server, Oracle or web services. This is the metadata that you use in your queries but that doesn’t change very often. You’ll want to set this up as a poll but with a very long interval. Exactly how long will vary based on your use cases … every few minutes or every hour or even longer. Depending on the amount of data that you have, you may also want to look at only getting changes since last poll … again, minimizing the amount of data being pulled across the wire is always a Very Good Thing™. The pattern for reference data is pretty well defined and hasn’t changed at all … I still refer folks to &lt;a href="http://blogs.msdn.com/b/appfabriccat/archive/2010/10/19/streaminsight-and-reference-data-lists-databases-etc.aspx" target="_blank"&gt;Mark Simms’ post of 2 years ago&lt;/a&gt;. With StreamInsight 2.1, some things have changed with &lt;a href="http://www.devbiker.net/post/Importing-CTIs-with-IQStreamableIQbservable-in-StreamInsight-21.aspx" target="_blank"&gt;importing CTIs&lt;/a&gt; (which I will look at again later) but the end result is still the same. &lt;/p&gt;  &lt;p&gt;So … hopefully I’ve fleshed out and clarified that mysterious step 2. In the end, it really depends on how you can get to the data that you want to analyze. The aggregation with push is what I try to lean towards … it’s relatively low latency and gives you a lot of bang for the buck. In the real world, you don’t want to be writing adapters for every device under the sun, especially when you can connect with OPC or OSISoft PI and leverage the extensive connectivity that you’ll have with these established platforms.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=y8w0manVdvQ:C8qvcqxSets:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=y8w0manVdvQ:C8qvcqxSets:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JdotNet/~4/y8w0manVdvQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/JdotNet/~3/y8w0manVdvQ/post.aspx</link>
      <author>jsawyer</author>
      <comments>http://www.devbiker.net/post/Where-does-StreamInsight-data-come-from.aspx#comment</comments>
      <guid isPermaLink="false">http://www.devbiker.net/post.aspx?id=5f51576e-65cf-4312-96c9-b654ce9a28b6</guid>
      <pubDate>Tue, 27 Nov 2012 22:32:23 -0500</pubDate>
      <dc:publisher>jsawyer</dc:publisher>
      <pingback:server>http://www.devbiker.net/pingback.axd</pingback:server>
      <pingback:target>http://www.devbiker.net/post.aspx?id=5f51576e-65cf-4312-96c9-b654ce9a28b6</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.devbiker.net/trackback.axd?id=5f51576e-65cf-4312-96c9-b654ce9a28b6</trackback:ping>
      <wfw:comment>http://www.devbiker.net/post/Where-does-StreamInsight-data-come-from.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.devbiker.net/syndication.axd?post=5f51576e-65cf-4312-96c9-b654ce9a28b6</wfw:commentRss>
    <feedburner:origLink>http://www.devbiker.net/post.aspx?id=5f51576e-65cf-4312-96c9-b654ce9a28b6</feedburner:origLink></item>
    <item>
      <title>Houston TechFest Sessions</title>
      <description>&lt;p&gt;&lt;a href="http://www.houstontechfest.com/" target="_blank"&gt;Houston TechFest&lt;/a&gt; is tomorrow at the Reliant Center. And, of course, I will be speaking. This year, I am doing two sessions: &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.houstontechfest.com/dotnetnuke/HoustonTechFest/Sessions/tabid/56/CodecampId/3/SessionId/475/Default.aspx" target="_blank"&gt;&lt;strong&gt;Back to Basics: .NET Essentials You May Have Forgotten&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;(3:40 PM – 4:40 PM)&lt;/p&gt;  &lt;p&gt;Now that the .NET Framework has been out for 10 years and so many tools are available to make things easier, many developers seem to have forgotten some of the core principles of .NET. In this presentation, I'll review the fundamentals of the .NET Framework and what makes all of that magic happen. From the CLR to IL to memory management and garbage collection, we'll touch on these core concepts that every developer should know.&lt;/p&gt;  &lt;p&gt;I originally did this presentation at HDNUG and it was very well received – better than I had thought it would be. However, because the timeframe is a bit more limited at TechFest vs. HDNUG, I’ll need to pare this down a little bit so I don’t go over. &lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;a href="http://www.houstontechfest.com/dotnetnuke/HoustonTechFest/Sessions/tabid/56/CodecampId/3/SessionId/483/Default.aspx" target="_blank"&gt;&lt;strong&gt;Introducing StreamInsight 2.1&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&amp;#160;&lt;/strong&gt;(4:50 PM – 5:50 PM)&lt;/p&gt;  &lt;p&gt;StreamInsight provides real-time analytics on large volumes of data with a response time measured in milliseconds, bringing a new level of capabilities to the Sql Server platform. This session will provide an overview of StreamInsight, its capabilities and use cases. It will also provide details on StreamInsight 2.1, what's been added and how it makes your real-time applications easier and more robust.&lt;/p&gt;  &lt;p&gt;I originally delivered this at Sql Saturday in Baton Rouge. I’ve tweaked and honed it a bit. Some will be familiar to my other StreamInsight intro presentations – how it works, etc. There are some updates on more use cases that we’ve seen “out in the wild” in the past year or so. StreamInsight is coming into its own now too … we are seeing more and more interest and adoption as folks get a better understanding of where it can add to their business.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;I hope to see you there! &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=G3dFEB0JLvU:zst2Lgx1SNQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=G3dFEB0JLvU:zst2Lgx1SNQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JdotNet/~4/G3dFEB0JLvU" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/JdotNet/~3/G3dFEB0JLvU/post.aspx</link>
      <author>jsawyer</author>
      <comments>http://www.devbiker.net/post/Houston-TechFest-Sessions.aspx#comment</comments>
      <guid isPermaLink="false">http://www.devbiker.net/post.aspx?id=b6120a91-6273-4214-92b6-b23a029643b0</guid>
      <pubDate>Fri, 07 Sep 2012 11:36:05 -0500</pubDate>
      <category>Community</category>
      <category>StreamInsight</category>
      <category>.NET Stuff</category>
      <category>User Groups</category>
      <dc:publisher>jsawyer</dc:publisher>
      <pingback:server>http://www.devbiker.net/pingback.axd</pingback:server>
      <pingback:target>http://www.devbiker.net/post.aspx?id=b6120a91-6273-4214-92b6-b23a029643b0</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.devbiker.net/trackback.axd?id=b6120a91-6273-4214-92b6-b23a029643b0</trackback:ping>
      <wfw:comment>http://www.devbiker.net/post/Houston-TechFest-Sessions.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.devbiker.net/syndication.axd?post=b6120a91-6273-4214-92b6-b23a029643b0</wfw:commentRss>
    <feedburner:origLink>http://www.devbiker.net/post.aspx?id=b6120a91-6273-4214-92b6-b23a029643b0</feedburner:origLink></item>
    <item>
      <title>Importing CTIs with IQStreamable/IQbservable in StreamInsight 2.1</title>
      <description>&lt;p&gt;This came up on the &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/streaminsight/thread/47b0b3c3-8d65-495c-b299-864e2913f6e8"&gt;StreamInsight forum&lt;/a&gt; … actually from one of the guys on my team. This is pretty important … since StreamInsight syncs to the slowest stream, if you have a slow-moving reference stream (as described so well &lt;a href="http://blogs.msdn.com/b/masimms/archive/2010/09/27/streaminsight-synchronizing-slow-moving-reference-streams-with-fast-moving-data-streams-time-import.aspx"&gt;here&lt;/a&gt;), you need to import the CTIs from your faster data stream into the slower stream to keep things moving along as the proper pace. We use this pattern all the time and ran into this when we were converting an existing demo to use the 2.1 model. &lt;/p&gt;  &lt;p&gt;Here’s what you need to do. First, you have your reference stream implemented and exposed as a simple Observable … you can use the .NET 4.0 IObservable interface for this; no special thing is needed. Your data stream should be exposed as an IQbservable or IObservable (you can get to IQStreamable from there) and the IObservable should include the CTIs. This means that your data source for the data stream needs to enqueue CTIs … you won’t really be able to use AdvanceTimeImportSettings.IncreasingStartTime/StrictlyIncreasingStartTime (since the CTIs aren’t exposed) nor will you be able to return as an IQStreamable and then switch it to a IQbservable (you’ll only get the payload). The first thing that we’ll need to do is to create a wrapper class that has both the payload and the temporal information and can also represent a CTI. Here’s an example: &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:56009c9e-9bab-4349-abfa-24d5b771772e" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Typed Event Class&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 3em; padding: 0 0 0 5px;"&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TypedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt; GetEvent(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; eventShape)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;switch&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (eventShape)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;case&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Interval:&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; GetIntervalEvent();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;case&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Edge:&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; GetEdgeEvent(); &lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;case&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EventShape&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Point:&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; GetPointEvent(); &lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;default&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;:&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;throw&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ArgumentOutOfRangeException&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;eventShape&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PointEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt; GetPointEvent()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (!&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.IsCti)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PointEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;.CreateInsert(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Start, Payload);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PointEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;.CreateCti(Start);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IntervalEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt; GetIntervalEvent()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (!&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.IsCti)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IntervalEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;.CreateInsert(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Start, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.End, Payload);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IntervalEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;.CreateCti(Start);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt; GetEdgeEvent()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.IsCti)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TPayloadType&amp;gt;.CreateCti(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Start);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.EdgeType == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeType&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Start)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.CreateStart(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Start, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Payload);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.CreateEnd(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Start, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.End, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Payload);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; PublishedEvent(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ctiDateTime)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;IsCti = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;true&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;Start = ctiDateTime;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;EdgeType=&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeType&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Start;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;End = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.MaxValue;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;Payload = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;default&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(TPayloadType); &lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Initializes a new instance of the &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;see cref=&amp;quot;PublishedEvent&amp;amp;lt;TEventType&amp;amp;gt;&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; struct.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;payload&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The Payload.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt; &lt;span style="background:#ffffff;color:#000000"&gt;        &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;This sets the start to &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;see cref=&amp;quot;DateTimeOffset&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;DateTimeOffset.MinValue&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/see&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt; &lt;span style="background:#ffffff;color:#000000"&gt;        &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;the end to &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;see cref=&amp;quot;DateTimeOffset&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;DateTimeOffset.MaxValue&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/see&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt; &lt;span style="background:#ffffff;color:#000000"&gt;        &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;and the edge type to the default value.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt; &lt;span style="background:#ffffff;color:#000000"&gt;        &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The subscriber is responsible for explicitly setting these parameters.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; PublishedEvent(TPayloadType payload)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{           &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;Start = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.MinValue;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;End = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.MaxValue;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;EdgeType = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;default&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeType&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;Payload = payload;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;IsCti = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Initializes a new instance of the &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;see cref=&amp;quot;PublishedEvent&amp;amp;lt;TEventType&amp;amp;gt;&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; struct.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;payload&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The event payload.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;startTime&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The start time.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;endTime&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The end time.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;edgeType&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Type of the edge.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt; &lt;span style="background:#ffffff;color:#000000"&gt;        &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;Use when the event publisher &amp;quot;knows&amp;quot; the appropriate start time, end time and/or the edge type.&lt;/span&gt;&lt;/li&gt; &lt;li&gt; &lt;span style="background:#ffffff;color:#000000"&gt;        &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt; &lt;span style="background:#ffffff;color:#000000"&gt;        &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;This is useful when publishing Payload that carry this information.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; PublishedEvent(TPayloadType payload, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; startTime, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; endTime, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeType&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; edgeType)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;Start = startTime;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;End = endTime;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;EdgeType = edgeType;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;Payload = payload;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;IsCti = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;false&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Gets or sets the Payload.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;value&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; The Payload.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/value&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; TPayloadType Payload;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Start;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; End;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeType&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; EdgeType;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;bool&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; IsCti;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;There are “helper” methods on the class to create the appropriate events from the wrapper for convenience. It makes the ToStreamable method a little simpler and clearer. Now that we have that, we need to define an event publisher. This exposes IObservable and provides the events to StreamInsight. It’s pretty simple and, like an adapter, has a configuration that is passed in. In our case, the configuration has the number of items to create and a refresh interval … how frequently new events are created. This also allows us to use one publisher for both the fast and slow moving events. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:831b8add-4b38-4393-8efc-3f5908421cc1" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Configuration class&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DataContract&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;()]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; TestDataInputConfig()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;RefreshInterval = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TimeSpan&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.FromMilliseconds(500);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;NumberOfItems = 10;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DataMember&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Name { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DataMember&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TimeSpan&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; RefreshInterval { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;[&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DataMember&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;]&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; NumberOfItems { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In the sample, this is a test data generator … it creates a payload that contains an Item Id, a run number (which iteration of the input) and a string so that we know a) where it came from and b) some payload info. Again, very simple but helps us validate that we are getting the results that we expect. And by implementing IObservable, we can publish this to StreamInsight using the new DefineObservable method. Since each published event has the payload &lt;em&gt;and &lt;/em&gt;temporal header information, it’s easy to then convert the IQbservable to a IQStreamable and get it going with temporal properties.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:7dcfbb7a-a262-40f2-a5a1-293371a398ef" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Test Data Event&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;static&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;List&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; CreateNext(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; runNumber)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;List&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; newReferenceData =&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;List&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(config.NumberOfItems);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;for&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; i = 0; i &amp;lt; config.NumberOfItems; i++)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;newReferenceData.Add(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                     &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                         &lt;span style="background:#ffffff;color:#000000"&gt;Source = config.Name,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                         &lt;span style="background:#ffffff;color:#000000"&gt;ItemId = &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Item&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; + i.ToString(),&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                         &lt;span style="background:#ffffff;color:#000000"&gt;RunNumber = runNumber, &lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                         &lt;span style="background:#ffffff;color:#000000"&gt;EventText = &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Text for Item &amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; + i.ToString() + &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot; Run Number &amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; + runNumber&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                     &lt;span style="background:#ffffff;color:#000000"&gt;});&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; newReferenceData; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Source { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ItemId { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; RunNumber { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; EventText { &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;get&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;set&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; }&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The publisher implements IObservable and creates events based on a timer. And it doesn’t start the timer until Subscribe is called … if we start producing them in the constructor, we’ll miss the first round of events and we don’t want to do that. &lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:87342187-3b7a-4ddb-bd1f-2e0cfa66c395" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Data Publisher&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataPublisher&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;:&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObservable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IDisposable&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Timer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; _enqueueTimer;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;int&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; _runNumber = 0;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;readonly&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; _config; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;readonly&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Dictionary&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;_instances = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Dictionary&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt;&amp;gt;(50);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; TestDataPublisher(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; config)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;_config = config;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;_enqueueTimer = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Timer&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(ProduceEvents, &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Timeout&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Infinite, &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Timeout&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Infinite);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Main driver to read events from source and enqueue them.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ProduceEvents(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;object&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; state)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;_runNumber++;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; newEvents =&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.CreateNext(_config, _runNumber);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; publishEvents = (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;from&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; e &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; newEvents&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                             &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;select&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(e)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                 &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                     &lt;span style="background:#ffffff;color:#000000"&gt;Start = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Now&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                 &lt;span style="background:#ffffff;color:#000000"&gt;}).ToList();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;foreach&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; observer &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; _instances.Values.AsParallel())&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;foreach&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; publishedEvent &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; publishEvents)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;observer.OnNext(publishedEvent);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;observer.OnNext(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Now.AddTicks(1)));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; Notifies the provider that an observer is to receive notifications.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; A reference to an interface that allows observers to stop receiving notifications before the provider has finished sending them.&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;///&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;param name=&amp;quot;observer&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;The object that is to receive notifications.&lt;/span&gt;&lt;span style="background:#ffffff;color:#808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IDisposable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Subscribe(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;&amp;gt; observer)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; instanceId = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Guid&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.NewGuid().ToString();&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;_instances.Add(instanceId, observer);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;observer.OnNext(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt;(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Now.AddMonths(-5)));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(_instances.Count == 1)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;_enqueueTimer.Change(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TimeSpan&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.FromSeconds(0), _config.RefreshInterval);       &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Disposable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Create(() =&amp;gt; Unsubscribe(instanceId));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Unsubscribe(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;string&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; id)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;_instances.Remove(id);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#0000ff"&gt;#region&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Disposable Pattern&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// (removed for brevity)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#0000ff"&gt;#endregion&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;} &lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;The magic, though, happens in the AdvanceTimeImporter. It’s kind of a &lt;a href="http://msdn.microsoft.com/en-us/library/hh229173(v=vs.103)"&gt;subject&lt;/a&gt; except that it observes both streams. It produces a single observable that has events from the event stream (with reference data) and the CTI stream. For the CTI stream, it is just an IObservable of DateTimeOffsets … so the CTIs don’t necessarily need to come from the moving data stream; they could be generated on a “clock”. The event stream doesn’t need to publish CTIs but, if it does, we exclude them (they’d just muddy the waters). We also have the option (as with the AdvanceTimeImportSettings) to adjust or drop events from the event stream that violate CTI rules. However, there’s on little implementation exception … when the value is Adjust, we adjust &lt;em&gt;all &lt;/em&gt;of the event start times, not just those intervals that cross into the CTI span, ensuring that all of our data events get into the output (merged) stream.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:8ca6d8c9-1259-4747-bd78-0cd0d90786dc" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Advance Time Importer&lt;/div&gt; &lt;div style="background: #ddd; max-height: 400px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//NOTE: need to put some thought around how to handle OnCompleted/OnError from the observables. &lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;class&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AdvanceTimeImporter&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TDataStreamEventType&amp;gt;:&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IDisposable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;, &lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObservable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TDataStreamEventType&amp;gt;&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObservable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TDataStreamEventType&amp;gt;&amp;gt; _dataStreamObservable; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TDataStreamEventType&amp;gt;&amp;gt; _observer;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;readonly&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IDisposable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; _eventStreamDisposable, _ctiStreamDisposable;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;readonly&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TimeSpan&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; _dataStreamRefreshInterval; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;readonly&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AdvanceTimePolicy&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; _importPolicy; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; AdvanceTimeImporter(&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObservable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TDataStreamEventType&amp;gt;&amp;gt; dataStream,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObservable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;gt; ctiStream, &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AdvanceTimePolicy&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; importPolicy)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;_dataStreamObservable = dataStream; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;_ctiStreamDisposable = ctiStream.Subscribe(NextCtiItem);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;_importPolicy = importPolicy;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;_eventStreamDisposable = _dataStreamObservable.Where(e=&amp;gt; !e.IsCti ).Subscribe(NextDataItem);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; _lastCtiTimestamp = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.MinValue; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; NextDataItem(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TDataStreamEventType&amp;gt; dataEvent)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(dataEvent.IsCti )&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Don&amp;#39;t publish the CTIs from the data stream. &lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Check for CTI violations but not for edge end. &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (dataEvent.Start &amp;gt;= _lastCtiTimestamp &amp;amp;&amp;amp; dataEvent.EdgeType != &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;EdgeType&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.End)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;PublishOnNext(dataEvent);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;System.Diagnostics.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Debug&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Data ... no CTI Violation&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;else&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (_importPolicy == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AdvanceTimePolicy&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Adjust)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{   &lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Adjust ... but not for end edges. &lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (dataEvent.Start &amp;lt;= _lastCtiTimestamp)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                &lt;span style="background:#ffffff;color:#000000"&gt;dataEvent.Start = _lastCtiTimestamp.AddTicks(1);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;PublishOnNext(dataEvent);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;System.Diagnostics.&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;Debug&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.WriteLine(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;Data ... adjusted for CTI Violation&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;public&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IDisposable&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; Subscribe(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;IObserver&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TDataStreamEventType&amp;gt;&amp;gt; observer)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;_observer = observer;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (_importPolicy == &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AdvanceTimePolicy&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Adjust)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//add a starter CTI. &lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;NextCtiItem(_lastCtiTimestamp);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;//Release our reference to the observable. &lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;_dataStreamObservable = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;return&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;this&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; NextCtiItem(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;DateTimeOffset&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; cti)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(cti &amp;gt;= _lastCtiTimestamp)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;_lastCtiTimestamp = cti;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;PublishOnNext(&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TDataStreamEventType&amp;gt;(cti));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;private&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;void&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; PublishOnNext(&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;PublishedEvent&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&amp;lt;TDataStreamEventType&amp;gt;  publishedEvent)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;if&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; (_observer != &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;null&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;            &lt;span style="background:#ffffff;color:#000000"&gt;_observer.OnNext(publishedEvent);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#0000ff"&gt;#region&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; IDisposable implementation&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#008000"&gt;// (removed for brevity)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#0000ff"&gt;#endregion&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;}&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;That’s really it. I also created an extension method for IObservable that makes this a bit simpler and clearer to call. One thing that I do in the extension method is to use the &lt;a href="http://msdn.microsoft.com/en-us/library/hh211810(v=vs.103)"&gt;Reactive Extensions Replay subject&lt;/a&gt; to make sure that latecomers to the Observable get the last batch of data that was published. &lt;/p&gt;  &lt;p&gt;Implementing the queries is pretty straightforward now.&lt;/p&gt;  &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:9ce6104f-a9aa-4a17-a79f-3a39532ebf7c:0b17b112-24cf-48ca-aff6-f544825921cb" class="wlWriterEditableSmartContent"&gt; &lt;div style="border: #000080 1px solid; color: #000; font-family: 'Courier New', Courier, Monospace; font-size: 10pt"&gt; &lt;div style="background: #000080; color: #fff; font-family: Verdana, Tahoma, Arial, sans-serif; font-weight: bold; padding: 2px 5px"&gt;Import CTI Queries&lt;/div&gt; &lt;div style="background: #ddd; max-height: 500px; overflow: auto"&gt; &lt;ol start="1" style="background: #ffffff; margin: 0 0 0 2.5em; padding: 0 0 0 5px;"&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; inputConfig = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;Name = &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;DataStream&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;RefreshInterval = &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TimeSpan&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.FromMilliseconds(500)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; referenceConfig = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataInputConfig&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;Name = &lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;ReferenceStream&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;RefreshInterval= &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TimeSpan&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.FromSeconds(15)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; dataSource = myApp.DefineObservable(() =&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataPublisher&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(inputConfig));&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; ctis = dataSource.Where(e =&amp;gt; e.IsCti).Select(e =&amp;gt; e.Start);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; referenceStream = myApp.DefineObservable(() =&amp;gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TestDataPublisher&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;(referenceConfig).ImportCTIs(ctis, referenceConfig.RefreshInterval,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;        &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;AdvanceTimePolicy&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.Adjust))&lt;/span&gt;&lt;/li&gt; &lt;li&gt;    &lt;span style="background:#ffffff;color:#000000"&gt;.ToIntervalStreamable(e =&amp;gt; e.GetIntervalEvent());&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; dataStream = dataSource.ToPointStreamable(e =&amp;gt; e.GetPointEvent());&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; outputStream = &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;from&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; d &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; dataStream&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                   &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;from&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; r &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;in&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; referenceStream&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;.AlterEventDuration(e=&amp;gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;TimeSpan&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;.MaxValue)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                        &lt;span style="background:#ffffff;color:#000000"&gt;.ClipEventDuration(referenceStream, (r1,r2) =&amp;gt; r1.ItemId == r2.ItemId)&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                   &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;where&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; d.ItemId == r.ItemId&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                   &lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;select&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;new&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; &lt;/span&gt;&lt;span style="background:#ffffff;color:#2b91af"&gt;ResultClass&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;()&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                              &lt;span style="background:#ffffff;color:#000000"&gt;{&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                  &lt;span style="background:#ffffff;color:#000000"&gt;DataRunNumber = d.RunNumber,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                  &lt;span style="background:#ffffff;color:#000000"&gt;ItemId = d.ItemId,&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                  &lt;span style="background:#ffffff;color:#000000"&gt;ReferenceString = r.EventText, &lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                  &lt;span style="background:#ffffff;color:#000000"&gt;DataSource = d.Source, &lt;/span&gt;&lt;/li&gt; &lt;li&gt;                                  &lt;span style="background:#ffffff;color:#000000"&gt;ReferenceSource = r.Source&lt;/span&gt;&lt;/li&gt; &lt;li&gt;                              &lt;span style="background:#ffffff;color:#000000"&gt;};&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&amp;nbsp;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;&lt;/span&gt;&lt;span style="background:#ffffff;color:#0000ff"&gt;var&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt; outputDataSink = GetOutputDataSink(myApp);&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span style="background:#ffffff;color:#000000"&gt;outputStream.Bind(outputDataSink).Run(&lt;/span&gt;&lt;span style="background:#ffffff;color:#a31515"&gt;&amp;quot;AdvanceTimeImport.Test&amp;quot;&lt;/span&gt;&lt;span style="background:#ffffff;color:#000000"&gt;);&lt;/span&gt;&lt;/li&gt; &lt;/ol&gt; &lt;/div&gt; &lt;/div&gt; &lt;/div&gt;  &lt;p&gt;In the sample, I’m using the old-school Tracer Adapter defined as a sink … that’s easy enough to change if you want to. Here’s the sample: &lt;/p&gt; &lt;iframe height="120" src="https://skydrive.live.com/embed?cid=E45DFECBE9DCC432&amp;amp;resid=E45DFECBE9DCC432%21421&amp;amp;authkey=AN-ctnFJY6i60SE" frameborder="0" width="98" scrolling="no"&gt;&lt;/iframe&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=yrxgjxbKLTs:ENdjQl3DiGg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=yrxgjxbKLTs:ENdjQl3DiGg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JdotNet/~4/yrxgjxbKLTs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/JdotNet/~3/yrxgjxbKLTs/post.aspx</link>
      <author>jsawyer</author>
      <comments>http://www.devbiker.net/post/Importing-CTIs-with-IQStreamableIQbservable-in-StreamInsight-21.aspx#comment</comments>
      <guid isPermaLink="false">http://www.devbiker.net/post.aspx?id=7a0586a2-c405-494c-b532-d2708c7655a5</guid>
      <pubDate>Tue, 31 Jul 2012 13:01:49 -0500</pubDate>
      <category>Code Sample</category>
      <category>StreamInsight</category>
      <dc:publisher>jsawyer</dc:publisher>
      <pingback:server>http://www.devbiker.net/pingback.axd</pingback:server>
      <pingback:target>http://www.devbiker.net/post.aspx?id=7a0586a2-c405-494c-b532-d2708c7655a5</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.devbiker.net/trackback.axd?id=7a0586a2-c405-494c-b532-d2708c7655a5</trackback:ping>
      <wfw:comment>http://www.devbiker.net/post/Importing-CTIs-with-IQStreamableIQbservable-in-StreamInsight-21.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.devbiker.net/syndication.axd?post=7a0586a2-c405-494c-b532-d2708c7655a5</wfw:commentRss>
    <feedburner:origLink>http://www.devbiker.net/post.aspx?id=7a0586a2-c405-494c-b532-d2708c7655a5</feedburner:origLink></item>
    <item>
      <title>Speaking at Sql Saturday in Baton Rouge</title>
      <description>&lt;p&gt;Next Saturday, August 4th, I will be speaking at &lt;a href="http://sqlsaturday.com/150/eventhome.aspx" target="_blank"&gt;Sql Saturday #150&lt;/a&gt; in Baton Rouge. As usual, I will be talking about StreamInsight. In this case, I’ll be talking about StreamInsight 2.1 and the new adapter model based on Observables and the Reactive Extensions. I hope to see you there! &lt;/p&gt;  &lt;p&gt;In other notes, I know I’ve been bad about blogging lately. I also know that I’ve not kept up to my intended schedule. I do have a lot of stuff queued up to write about and I’m working on the first one. I’m planning a series of posts that will build on each other and exploring several different topics with StreamInsight. I’m not going to spoil the surprise though … you’ll have to come back to read them but I do promise that they will be good, in-depth articles that detail pieces of a real-world architecture of a StreamInsight application. &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=KcxuK6AOh48:VIjBtyODQwA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/JdotNet?a=KcxuK6AOh48:VIjBtyODQwA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/JdotNet?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/JdotNet/~4/KcxuK6AOh48" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/JdotNet/~3/KcxuK6AOh48/post.aspx</link>
      <author>jsawyer</author>
      <comments>http://www.devbiker.net/post/Speaking-at-Sql-Saturday-in-Baton-Rouge.aspx#comment</comments>
      <guid isPermaLink="false">http://www.devbiker.net/post.aspx?id=a839ca76-b936-4da2-b305-e34414fce356</guid>
      <pubDate>Sat, 28 Jul 2012 22:22:44 -0500</pubDate>
      <category>Community</category>
      <category>User Groups</category>
      <category>StreamInsight</category>
      <dc:publisher>jsawyer</dc:publisher>
      <pingback:server>http://www.devbiker.net/pingback.axd</pingback:server>
      <pingback:target>http://www.devbiker.net/post.aspx?id=a839ca76-b936-4da2-b305-e34414fce356</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.devbiker.net/trackback.axd?id=a839ca76-b936-4da2-b305-e34414fce356</trackback:ping>
      <wfw:comment>http://www.devbiker.net/post/Speaking-at-Sql-Saturday-in-Baton-Rouge.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.devbiker.net/syndication.axd?post=a839ca76-b936-4da2-b305-e34414fce356</wfw:commentRss>
    <feedburner:origLink>http://www.devbiker.net/post.aspx?id=a839ca76-b936-4da2-b305-e34414fce356</feedburner:origLink></item>
  </channel>
</rss>
