.NET의 동시 스레드 간에 데이터를 전달하는 가장 좋은 방법은 무엇입니까?

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

문제

두 개의 스레드가 있는데, 하나는 업데이트를 찾기 위해 여러 개의 별도 정적 리소스를 폴링해야 합니다.다른 하나는 데이터를 가져와 데이터베이스에 저장해야 합니다.스레드 1이 스레드 2에게 처리할 것이 있음을 어떻게 알릴 수 있습니까?

도움이 되었습니까?

해결책

데이터 조각이 독립적인 경우 데이터 조각을 스레드 풀에서 처리할 작업 항목으로 처리합니다.스레드 풀을 사용하고 QueueUserWorkItem 데이터를 스레드에 게시합니다.대칭 스레드 풀을 사용하고 생산자와 소비자 간에 발생해야 하는 동기화 양을 제한하면 확장성이 향상됩니다.

예를 들어 (에서 MSDN):

    TaskInfo ti = new TaskInfo("This report displays the number {0}.", 42);

    // Queue the task and data.
    if (ThreadPool.QueueUserWorkItem(new WaitCallback(ThreadProc), ti)) {    
        Console.WriteLine("Main thread does some work, then sleeps.");

        // If you comment out the Sleep, the main thread exits before
        // the ThreadPool task has a chance to run.  ThreadPool uses 
        // background threads, which do not keep the application 
        // running.  (This is a simple example of a race condition.)
        Thread.Sleep(1000);

        Console.WriteLine("Main thread exits.");
    }
    else {
        Console.WriteLine("Unable to queue ThreadPool request."); 
    }


// The thread procedure performs the independent task, in this case
// formatting and printing a very simple report.
//
static void ThreadProc(Object stateInfo) {
    TaskInfo ti = (TaskInfo) stateInfo;
    Console.WriteLine(ti.Boilerplate, ti.Value); 
}

다른 팁

작업 항목 대기열에서 Monitor.Wait/Pulse를 사용합니다.

"DB에 저장" 스레드가 항상 실행되어야 합니까?가능한 경우 가장 좋은 옵션은 폴링 스레드가 다른 스레드를 회전시켜 저장을 수행하도록 하는 것입니다.생성되는 스레드 수에 따라 첫 번째 폴링 스레드에서 ThreadPool.QueueUserWorkItem()을 사용하는 것이 더 효율적인 경로일 수 있습니다.

효율성을 높이기 위해 데이터베이스에 저장할 때 동기화 방법 대신 DB에 비동기 I/O를 사용합니다.

두 스레드 간에 직접 통신할 필요가 없으면 언제든지 그렇게 해야 합니다.일부 동기화 프리미티브를 함께 던져야 하는 경우 코드는 디버깅하기가 쉽지 않으며 "백만 번 실행에 한 번" 유형의 버그(찾기/수정하기가 쉽지 않음)를 유발하는 매우 미묘한 경쟁 조건이 발생할 수 있습니다.

두 번째 스레드가 항상 실행되어야 하는 경우 추가 정보를 통해 이유를 알려주시면 더 심층적인 답변을 드릴 수 있습니다.

행운을 빌어요!

나는 개인적으로 스레드 2가 응답할 수 있는 스레드 1의 이벤트를 발생시키려고 합니다.스레드는 두 스레드를 모두 시작하는 제어 프로세스에 의해 적절한 이벤트에 연결될 수 있습니다.

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