Бих искал да заменя съществуващата си реализация на събития с такава, която може да обработва събития, когато постъпват, едновременно, ако е необходимо. За съжаление никога преди не съм прилагал някакъв вид паралелност, но трябва да започна отнякъде, нали?
Четох за Функционално реактивно програмиране. Въпреки сравнително простите изглеждащи примери, аз съм объркан как трябва да приложа тези примери в моето приложение. Всъщност дори не съм сигурен дали това е най-подходящият начин за постигане на едновременност тук.
Също така по някакъв начин бих могъл да използвам Task Parallel Library (TPL), тъй като предлага управление на нишки, тогава не е нужно да се тревожа твърде много за раждането на твърде много нишки. За съжаление примерите в горната връзка не съдържат такива, които използват TPL.
Текущият ми код е по-долу. Все още съм начинаещ програмист и ще имам нужда от малко държане за ръка, за да премина. Извинения за неприятностите. :(
open System
open System.Threading
open Npgsql
// This application is a Windows service. PostgreSQL sends a notice whenever a new row has been added to a table.
// The next function processes new rows, aka tasks.
let private processTask () =
EventLog.writeEventLog "Information" "Received new task notification."
// Task processing yet to be implemented.
// A connection to PostgreSQL that stays open while service is running. Receives notifications.
let newNotifyConnection (host : string, username : string, password : string, database : string) =
let connectionString = sprintf "Host=%s;Username=%s;Password=%s;Database=%s;ContinuousProcessing=true;Keepalive=120;CommandTimeout=0" host username password database
new NpgsqlConnection(connectionString)
let private notifyConnection = newNotifyConnection Settings.npgsqlConnection
let private listen = new NpgsqlCommand("LISTEN newtask", notifyConnection)
// Event for receiving and processing notifications.
let private onNotification (sender : obj) (e : NpgsqlNotificationEventArgs) =
processTask()
let private notificationEventHandler = new NotificationEventHandler(onNotification)
// Run this function when service starts.
let startWorker () =
notifyConnection.Notification.AddHandler(notificationEventHandler)
notifyConnection.Open()
listen.ExecuteNonQuery() |> ignore
// Run this function when service stops.
let stopWorker () =
listen.Dispose()
notifyConnection.Dispose()