어떻게 할 이벤트 기반 프로그래밍 사이에는 2 개의 별도의 C#프로그램?
-
20-09-2019 - |
문제
를 발생시키는 방법에 대해 이벤트에서 별도의 C#프로그램입니까?
C#프로그램으로 나는 일에는 두 가지 별도의 요소를 사용:작업자(TC)그리고 작업 프로세서(TP).TC 연결된 웹 서비스는 지속적으로 삽입하는 새로운 작업으로 데이터베이스 테이블.다른 한편으로 TP 에서 읽고 동일한 테이블 및 프로세스는 각 작업에 그 후 업데이트 상태를 다시하기 위한 소프트웨어 기술입니다.그것은 거의 같은 큐 그러나 사용하여 수행하는 데이터베이스 보다는 오히려 예:MSMQ.모든 5 초간 TP 깨어나서를 읽습에서 테이블을 확인에 대한 처리 되지 않은 작업 그러나 이것은 어떤 성과에 영향을 끼칩니다.이 없을 때 새로운 작업 그것은 약간의 낭비를 불을 선택하는 곳에서 SQL 문입니다.는 이상적인 방법은 어떤 종류의 통지 방법을 때 새로운 작업은 삽입 TP 을 얻을 것이 통보하고 다음에서 깨어나는 그의 꿈을 확인하고 새로운 작업입니다.
현재 해결책:
다이어그램의 현재 솔루션 http://yuml.me/3b49bcfd
는 이상적인 솔루션:
해결책
나 MSMQ.:)저는지 당신은 그것을 사용하지 않는,그러나 당신이 그것을 언급에서 당신의 질문입니다.이것은 꽤 많은 정확히 무엇 MSMQ 위해 설계되었...튼튼한 이벤트 사용됩니다.그것은 주로 지원하는 펍/하위 메시지를 모델하는 기반으로"이상적인 해결책은"정확하게 당신이 필요:TC 은 게시자,TP 것입니다.TC 등록 작업,그 메시지에 게시합니다.TP 작업이 필요하지 않습하고 실행에 대한 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 기본적으로 합니다.내가 믿는 당신은 또한 데이터를 직렬화에서는 바이너리 형식의 경우는 당신이 필요합니다.어느 쪽이든,당신은 알 수 없는 스레드가 있습니다.잠 전화 또는 폴링다.루프 종료에 기반해 있다고 가 허용,당신을 깨끗하게 스레드가 끝나지 않고는 하드 중단됩니다.
다른 팁
새로운 작업이 없을 때 SQL 문서에서 선택을 해소하는 것은 약간의 폐기물입니다.
단일 테이블에서 선택, 간단한 기준이있는 5 초마다 선택되며 일반적으로 반환 된 행은 일반적으로 아무것도 옆에 없습니다. 걱정하지 마십시오.
체크 아웃 SQL Server 2005 쿼리 알림. 방금 SQL Server 2008에서 가져온 것으로 보이므로 결국 최선의 아이디어가 아닐 수도 있습니다.
나는 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();
5 초마다 전화가 어떻게 그렇게 성능을 발휘할 수 있는지 알 수는 없습니다.