どのようなイベント駆動プログラミングと2つの別々のC#プログラム?
-
20-09-2019 - |
質問
かに火をつけるイベントから別のC#プログラム?
C#プログラムまたは二つの別々の部品タスクの作成(TC)と業務プロセッサー(TP).TCが付いwebサービスを常に挿入しますの新たな課題はデータベース化します。一方TPを読み込み、同じテーブルやプロセスの各業務その後更新の状況に同表に示す。このようなキューが用データベースなどMSMQ.毎秒5秒TP起とを読み込みのテーブルからチェックのための未処理タスクしかしこれは一部の性能に影響が及んでいる。がありませんの新たな課題奥高尾にひっそりと建つ料亭。廃棄物の火災を選択からSQL文です。最適な方法は何らかの通知方法が新たな課題に挿入されTP得通知をしてから目覚め、その夢をチェックのための新事ができます。
流動液
理想的なソリューション:
解決
のものをお勧めしますMSMQ.:)私はいないだを使用しているのではないでしまったのでご質問です。これはかMSMQした。耐久eventingと願います。これは、主に支pub/subメッセージモデルにもとづいて"をご理想的なソリューション"が必要なまさにそのものである:TCの出版社-TPは加入者.レジスタTCの課題では、その下のメッセージに公開します。このタスクなしにすることによりTCたドロップメッセージのキューとなっていたが、TPのタスクが実行で通知を受け取る取り扱いメッセージをキューに優先順に付します。
まMSMQなオプションでも利用WCF.よpub/sub、WCFきトFAF(火を忘れて)からのメッセージモデルです。TPうに公開するサービスTC消費す.TCだけで火災のメッセージをTPサービスに通知TPの新規事ができます。下の方にはこのモデルはTCに依存TP、以下のアイデアです。TPもするとともに、TCに成功し機能で依存TPのサービスです。のMSMQアプローチは、TPもTCに依存しているので、お互いをおこなっているだけに依存MSMQ(低カップリングです。)
編集:
方法の例を使用MSMQ火災イベントからのTCへの対応のイベントTP.
// TC message queue manager, sends messages
public class TaskMessageQueueManager
{
public void NotifySubscribersOfNewTasks()
{
var queue = getQueue(".\private$\TaskNotifications");
queue.Send("Tasks waiting.");
}
private MessageQueue getQueue(string name)
{
MessageQueue queue = null;
try
{
if (!MessageQueue.Exists(name))
{
queue = MessageQueue.Create(name);
}
else
{
queue = new MessageQueue(name);
}
}
catch (Exception ex)
{
throw new InvalidOperationException("An error occurred while retrieving the message queue '" + name + "'.", ex);
}
return queue;
}
}
// TP message queue handler, receives messages
public class TaskMessageQueueHandler
{
private Thread m_thread;
private ManualResetEvent m_signal;
public void Start()
{
m_signal = new ManualResetEvent(false);
m_thread = new Thread(MSMQReceiveLoop);
m_thread.Start();
}
public void Stop()
{
m_signal.Set();
}
private void MSMQReceiveLoop()
{
bool running = true;
MessageQueue queue = getQueue(".\private$\TaskNotifications");
while (running)
{
try
{
var message = queue.Receive(); // Blocks here until a message is received by MSMQ
if (message.Body.ToString() == "Tasks waiting.")
{
// TODO: Fire off process, perhaps another thread, to handle waiting tasks
}
if (m_signal.WaitOne(10)) // Non-blocking check for exit signal
{
running = false; // If Stop method has been called, the signal will be set and we can end loop
}
}
catch
{
// handle error
running = false;
}
}
}
}
メッセージでなくて簡単です。送信できオブジェクトまたはオブジェクトのグラフで自動的に直列化された形式としてXMLとしてデフォルトです。ダウンロードいただけまでserializeデータをバイナリ形式のものにしようと思えばあります。もしかしたらいありません。眠りの為のポーリングします。ループを口に基づくManualResetEventを可能にし、きれいに端のスレッドなハードabort.
他のヒント
がありませんの新たな課題奥高尾にひっそりと建つ料亭。廃棄物の火災を選択からSQL文です。
選んだ一つのテーブル毎に5秒簡単な基準とな列に返される通常のコストもんので安心です。
チェック SQL Server2005年のクエリの通知.えることで引っ張られて来たからSQL Server2008でない場合も最適です。
またMSMQであろうがよりよい方法で行われている。併 nServiceBus きり決定します。
もう一つのアプローチできるスレッド同期のイベント。
にTPがいいようなもの:
EventWaitHandle taskEvent = new EventWaitHandle(true,
EventResetMode.AutoReset,
"newTask",
out wasCreated);
new Thread(WaitForTask).Start();
...
public void WaitForTask() { while (true) { taskEvent.WaitOne(); ProcessTasks();} }
およびTC:
bool eventExist;
while (!eventExist)
{
try
{
taskEvent= EventWaitHandle.OpenExisting("newTask");
eventExist = true;
}
catch (WaitHandleCannotBeOpenedException)
{
eventExist = false;
Thread.Sleep(1000);
}
}
CreateNewTask();
taskEvent.Set();
なんかコ毎秒できない、ということにな独り占め。