2014-02-20 3 views
1

Приложение c# прилагается к таблице таблиц MS SQL в несколько раз. записи этой таблицы должны быть прочитаны и обработаны другим приложением c#.Внедрение обработчика событий C#

На данный момент я выполнивших я Threading таймер, который выглядит (каждые 2 секунды), если таблица имеет строки и proccess данные:

System.Threading.Timer checkTimer; 

checkTimer = new System.Threading.Timer(Callback, null, 2000, 500); 

private void InitSQLCon() 
{ 
    Con = new SqlConnection(ConectionString); 
    Con.Open(); 
}   

private void Callback(Object state) 
{ 
    string queryString = "Select [Wi_Customer ID],[Wi_License_plate_ID] from " + Properties.Settings.Default.Table1 + " where Wi_Car_Rfid='" + s + "'"; 
    SqlCommand command = new SqlCommand(queryString, Con); 

    SqlDataReader reader = command.ExecuteReader(); 
    if (reader.HasRows) 
    { 
     ///...make neccessary operations 
    }  
} 

Моя проблема заключается в том, что текущая реализация не эффективна. Проверка стола таймером требует ресурсов. Я хотел бы сделать это в случае, когда он прошел путь. В идеале я хотел бы реализовать и обработчик событий, поднятый событием add record to table1 . Если это возможно (поскольку я никогда не выполнял обработчик событий), я был бы признателен за любые отзывы о том, как это можно сделать.

+0

возможно дубликат [Есть ли что-нибудь в C#, который может быть используется как база данных Trigger] (http://stackoverflow.com/questions/17807513/is-there-anything-in-c-sharp-that-can-be-used-as-database-trigger) –

+0

Также - почему вы создавая новый SqlConnection каждый раз, а не закрывая и снова открывая его? – Tarec

+1

Кто вставляет запись? Ваше заявление или другое третье лицо? – BatteryBackupUnit

ответ

2

Там являются некоторые функции отслеживания изменений в SQL Server, наиболее заметным экспонируется через SqlDependency - однако, честно говоря, я думаю, что вы могли бы сделать лучше, чтобы посмотреть на механизм уведомления отдельный. Например, я большой поклонник redis pub/sub, потому что это смешно простой в настройке (черт возьми, выделенный сервер-суб-сервер даже не нуждается в настойчивости, поэтому «bgsave»/«fork» проблема, которая делает redis сложным в окнах, не применяется, поэтому вы можете просто использовать redis-сервер, доступный в nuget). Затем вы просто подписчитесь на именованный канал, и у вас есть другие части системы, которые передают сообщение этому именованному каналу, когда они добавляют работу. Простой и эффективный. Для надежности вы также должны периодически указывать опрос вручную - но, вероятно, на гораздо более медленном опросе - может быть, каждые 30 секунд или что-то в этом роде.


Вот пример паба/подразделам с помощью Redis с помощью BookSleeve (вы также будете нуждаться в redis-server работает на локальной машине):

using System; 
using System.Text; 
using BookSleeve; 

static class Program 
{ 
    static void Main() 
    { 
     // IMPORTANT: the "pub" and "sub" can be on entirely separate machines, 
     // as long as they are talking to the same server. They are only shown 
     // together here for convenience 
     using (var sub = new RedisSubscriberConnection("localhost")) 
     using (var pub = new RedisConnection("localhost")) 
     { 
      sub.Open(); 
      pub.Open(); 

      sub.Subscribe("busytime", (queue,payload) => 
      { 
       // you don't actually need the payload, probably 
       var received = Encoding.UTF8.GetString(payload); 
       Console.WriteLine("Work to do! Look busy!: " + received); 
      }); 

      string line; 
      Console.WriteLine("Enter messages to send, or q to quit"); 
      while((line = Console.ReadLine()) != null && line != "q") 
      { 
       pub.Publish("busytime", line); 
      } 
     } 
    } 
} 
Смежные вопросы