Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/rx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Rx/NET/Samples/HOL/CS/Excercise9/Step04/Program.cs')
-rw-r--r--Rx/NET/Samples/HOL/CS/Excercise9/Step04/Program.cs88
1 files changed, 88 insertions, 0 deletions
diff --git a/Rx/NET/Samples/HOL/CS/Excercise9/Step04/Program.cs b/Rx/NET/Samples/HOL/CS/Excercise9/Step04/Program.cs
new file mode 100644
index 0000000..e9cb8f6
--- /dev/null
+++ b/Rx/NET/Samples/HOL/CS/Excercise9/Step04/Program.cs
@@ -0,0 +1,88 @@
+using System;
+using System.Linq;
+using System.Reactive.Linq;
+using System.Windows.Forms;
+using System.Reactive.Disposables;
+using Excercise9.DictionarySuggestService;
+
+namespace Excercise9
+{
+ class Program
+ {
+ static void Main()
+ {
+ var txt = new TextBox();
+ var lst = new ListBox { Top = txt.Height + 10 };
+
+ var frm = new Form()
+ {
+ Controls = { txt, lst }
+ };
+
+#if PRODUCTION
+ // Turn the user input into a tamed sequence of strings.
+ var textChanged = from evt in Observable.FromEventPattern(txt, "TextChanged")
+ select ((TextBox)evt.Sender).Text;
+
+ var input = textChanged
+ .Throttle(TimeSpan.FromSeconds(1))
+ .DistinctUntilChanged();
+#else
+ const string INPUT = "reactive";
+
+ var rand = new Random();
+
+ var input = Observable.Generate(
+ 3,
+ len => len <= INPUT.Length,
+ len => len + 1,
+ len => INPUT.Substring(0, len),
+ _ => TimeSpan.FromMilliseconds(rand.Next(200, 1200))
+ )
+ .ObserveOn(txt)
+ .Do(term => txt.Text = term)
+ .Throttle(TimeSpan.FromSeconds(1));
+#endif
+
+ // Bridge with the web service's MatchInDict method.
+ var svc = new DictServiceSoapClient("DictServiceSoap");
+ var matchInDict = Observable.FromAsyncPattern<string, string, string, DictionaryWord[]>
+ (svc.BeginMatchInDict, svc.EndMatchInDict);
+
+#if PRODUCTION
+ Func<string, IObservable<DictionaryWord[]>> matchInWordNetByPrefix =
+ term => matchInDict("wn", term, "prefix");
+#else
+ Func<string, IObservable<DictionaryWord[]>> matchInWordNetByPrefix =
+ term => Observable.Return
+ (
+ (from i in Enumerable.Range(0, rand.Next(0, 50))
+ select new DictionaryWord { Word = term + i })
+ .ToArray()
+ ).Delay(TimeSpan.FromSeconds(rand.Next(1, 10)));
+#endif
+
+ // The grand composition connecting the user input with the web service.
+ var res = (from term in input
+ select matchInWordNetByPrefix(term))
+ .Switch();
+
+ // Synchronize with the UI thread and populate the ListBox or signal an error.
+ using (res.ObserveOn(lst).Subscribe(
+ words =>
+ {
+ lst.Items.Clear();
+ lst.Items.AddRange((from word in words select word.Word).ToArray());
+ },
+ ex =>
+ {
+ MessageBox.Show(
+ "An error occurred: " + ex.Message, frm.Text, MessageBoxButtons.OK, MessageBoxIcon.Error
+ );
+ }))
+ {
+ Application.Run(frm);
+ } // Proper disposal happens upon exiting the application.
+ }
+ }
+}