Я хотел бы заменить существующую реализацию событий на такую, которая может обрабатывать события по мере их поступления, при необходимости одновременно. К сожалению, я никогда раньше не реализовывал какой-либо параллелизм, но нужно же с чего-то начинать, а?
Я читал об Функциональном реактивном программировании. Несмотря на то, что примеры выглядят относительно просто, я не понимаю, как применять эти примеры в своем приложении. На самом деле, я даже не уверен, является ли это наиболее подходящим способом достижения параллелизма здесь.
Я также каким-то образом смог бы использовать библиотеку параллельных задач (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()