2009-12-01 3 views
1

현재 2 + k loc의 여러 파일을 가지고있는 다소 복잡한 다중 스레드 응용 프로그램을 상속 할 수도 있습니다. 전역 변수가 많은 곳에서 액세스하고 많은 관행에서 액세스 할 수 있습니다.멀티 스레드 응용 프로그램을위한 전략

현재 패턴으로 새 기능을 추가하기 전에 응용 프로그램의 기본 아키텍처를 더 잘 만들 수 있는지 알아보고자합니다. 다음은 간단한 설명이다 :

  • 앱 데이터 메모리 목록에 있고, 챠트, listB
  • 앱, dataFileB을 dataFileA (오프라인 기능을 위해) 데이터의 로컬 복사본이
  • 앱 실 TA1, TB1을 갖는 서버에서 클라이언트로
  • 스레드 TA2, TB2 업데이트 더티 데이터 서버 클라이언트에서 더티 데이터를 업데이트
  • 스레드 TA3, TB3 업데이트 로컬 파일에 메모리 목록에있는 더러운 데이터

나는 어떤 패턴, 전략, 프로그래밍 관행이 다른지에 관해서 다소 문제가있다. 이것에 대한 최선의 결정을 내릴 수있는 지식을 갖춰야한다. 여기

내가 나 자신을 위해 발명 한 몇 가지 목표입니다 :

  1. 이 쉽게 일반 인턴은 새로운 기능을 추가 할 수 있도록 가능한 한 안정적인 응용 프로그램을 유지 (큰없는 노 보일러의 50 개 라인 각각의 새로운 EditRecordX.cs 코드)는
  2. 복잡성이 프로젝트에 나를 도울 수있는 키워드 또는 다른 팁

감사를 줄입니다.

답변

0

난 당신이 살펴 보도록해야한다고 생각 : http://msdn.microsoft.com/en-us/concurrency/default.aspx

그리고이 블로그 항목 : http://blogs.msdn.com/pfxteam/

그리고이 : http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx

그것이 도움이되기를 바랍니다.

+0

주석 주셔서 감사합니다. 나는 그것들을 점검 할 것이지만, 지금은 2.0 우주에 머물러 있기 때문에 vs2010과 4.0에 가능한 해결책은 제게 도달하지 못합니다. – Morri

1

또 다른 목표는 전역 상태를 제거/축소하고 가능한 한 자주 스택에 정보를 유지하여 경쟁 조건 및 이상한 스레드 문제를 줄이는 것입니다.

tA2, tB2, tA3 및 tB3을 동일한 스레드에 통합하여 몇 가지를 죽일 수 있는지 알아 보는 것이 좋습니다. 그렇게 할 수 없다면 외관 (UI와 서버와 통신중인 서비스간에 데이터 요청을 이동시키는 것과 관련이있는 스레드) 뒤에 배치하는 것이 좋습니다. 이것은 "사용자가 직면하는"코드가 2 개가 아니라 하나의 클라이언트 만 처리해야하기 때문입니다. (단방향 프로세스처럼 들리는 클라이언트로 백업을 계산하지 않습니다.)

스레드 (UI 및 외관)가 요청을 완료 할 때까지 기다리면 "푸시 업데이트"와 동시에 "풀 업데이트"가 발생하지 않습니다.

+0

"전역 상태 제거/감소 및 가능한 한 자주 스택 정보 유지"이 점에 대해 명확히 할 수 있습니까? 스택으로 무엇을 의미하는지 확신 할 수 없습니까? – Morri

+0

스택이란 현재 메서드에 전달되는 인수를 의미합니다. 이것은 스택 맨 위에있는 것입니다. 전역 상태를 제거하고 대신 관련 정보를 인수로 전달하는 방법을 찾으면 (스레드 A의 참조가 스레드 B가 작동하는 데이터를 변경하지 못하도록 딥 복사도 가능함) 스레딩 문제. 특히 원래 개념의 함수 프로그래밍과 관련하여 "순결"이라는 개념을 읽으십시오. – Quibblesome

+0

http://en.wikipedia.org/wiki/Pure_function은 순결의 전제입니다. "순수한"코드의 가장 좋은 점은 경쟁 조건이 없다는 것입니다. "순수한"코드의 최악은 기술적으로 아무 것도 할 수 없다는 것입니다 (기술적으로 Console.WriteLine은 불투명합니다). 그러나 개념은 특히 스레드를 다룰 때 가치가 있습니다. – Quibblesome

1

일반적으로 이러한 종류의 변경을하려면 Martin Fowler의 Refactoring: Improving the Design of Existing Code (대다수는 the refactoring website)과 Refactoring to Patterns을 참조하십시오.안전한 변경을 지원하는 데 유용한 Working Effectively with Legacy Code을 찾을 수도 있습니다. 다중 스레드 환경에서 더 간단한 코드를 다루기가 더 쉽다는 점을 제외하면 다중 스레드와 관련하여 특별히 도움이되는 것은 없습니다.

2

Quibblesome의 훌륭한 제안으로, immutable objects을 사용하면 스레드 문제의 위험을 줄일 수있는 효과적인 방법이라고 덧붙일 수 있습니다. (.NET 및 Java의 문자열과 같이 변경 불가능한 객체는 일단 만들어지면 수정할 수 없습니다.)

관련 문제