어떻게 할 이벤트 기반 프로그래밍 사이에는 2 개의 별도의 C#프로그램?

StackOverflow https://stackoverflow.com/questions/1339243

  •  20-09-2019
  •  | 
  •  

문제

를 발생시키는 방법에 대해 이벤트에서 별도의 C#프로그램입니까?

C#프로그램으로 나는 일에는 두 가지 별도의 요소를 사용:작업자(TC)그리고 작업 프로세서(TP).TC 연결된 웹 서비스는 지속적으로 삽입하는 새로운 작업으로 데이터베이스 테이블.다른 한편으로 TP 에서 읽고 동일한 테이블 및 프로세스는 각 작업에 그 후 업데이트 상태를 다시하기 위한 소프트웨어 기술입니다.그것은 거의 같은 큐 그러나 사용하여 수행하는 데이터베이스 보다는 오히려 예:MSMQ.모든 5 초간 TP 깨어나서를 읽습에서 테이블을 확인에 대한 처리 되지 않은 작업 그러나 이것은 어떤 성과에 영향을 끼칩니다.이 없을 때 새로운 작업 그것은 약간의 낭비를 불을 선택하는 곳에서 SQL 문입니다.는 이상적인 방법은 어떤 종류의 통지 방법을 때 새로운 작업은 삽입 TP 을 얻을 것이 통보하고 다음에서 깨어나는 그의 꿈을 확인하고 새로운 작업입니다.

현재 해결책:

다이어그램의 현재 솔루션 http://yuml.me/3b49bcfd

는 이상적인 솔루션:

다이어그램의 idealsolution http://yuml.me/5cf843a5

도움이 되었습니까?

해결책

나 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 초마다 전화가 어떻게 그렇게 성능을 발휘할 수 있는지 알 수는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top