2014-06-08 1 views
0

나는 대표자들과 너무 혼돈되어있어, 내 마음은 스스로 먹을거야.C# 대리인의 혼란과 지식 부족

서로 다른 스레드를 연결하여 서로에게 작업을 수행하려고합니다. 하지만 분명히 "크로스 스레드 호출은 안전하지 않습니다"예외가 발생하므로 대신 대리인을 제공해야합니다. 무수한 튜토리얼, 문서, 예제를 읽었습니다. 시도해보기 때문에 각 예제에서 조금 더 자세히 설명합니다. 은 작동하지 않습니다.. 나는 두 개의 스레드

:

여기에 간단한 코드가없는 방법으로 내 셋업입니다. 클래스 DISPLAY_WITH_RICHTEXTBOX

클래스 내가 편집있을 것 RICH_TEXT_BOX을 가지고있다

THREAD1.

클래스는 방법 INT의 WRITE_TO_TEXTBOX_AND_RETURN_FEEDBACK (문자열 텍스트)

이 있는지 확인합니다.

클래스 SOME_CONTROL_PANEL을 가지고

THREAD2는 그 클래스는 그 클래스가 다른 클래스에서 메소드를 호출하는 BUTTON_OF_MAGIC을 가지고 그것을

에 텍스트와 TEXT_BOX_OF_DOOM있다 텍스트 상자의 텍스트를 richtextbox에 추가하십시오. 이 메서드를 실행하면이 메서드는 리치 텍스트 상자의 텍스트의 새 전체 크기로 다시 나에게 반환됩니다.

.

내 문제는이 구조를 가장 깨끗하게 만드는 방법을 알아낼 수 없다는 것입니다.

  1. 내가 명시 적으로 쉽게
  2. 내가 나를 위해 편집을 할 수있는 방법을 호출 마십시오 코드에서 /에 걸릴하고, THREAD2 THREAD1로 업그레이드하고, 대리인 또는 무언가를 통해 컨트롤을 조작 마십시오 , THREAD1 클래스는 THREAD2 클래스에 에 종속됩니까?

그리고 실제로 대리인을 빌드합니다. 언제 어디서나 시도해 볼 때마다 코드는 일 때만 대리자를 사용할 수 있다고 불평하지만 실제로 만들려는 대상은 대단히 실용적입니다. 이를 해결하려면 THREAD1에서 일부 변수를 만들고 THREAD2에서 변수를 편집 한 다음 THREAD1이 변수를 어떻게 처리해야하는지 파악하여 THREAD2> THREAD1의 모든 상호 작용을 전달하십시오. 하지만 그렇게되면 내 THREAD1 코드가 너무 깔끔하고 정돈되지 않아 울뿐입니다.

THREAD2 -> THREAD1에서 함수를 호출하는 또 다른 방법은 깔끔하고 변수와 사용자 정의 thread-locking-code-of-doom을 사용하지 않아도됩니다.

나는 내가 무슨 뜻인지 이해할 수 있기를 바랍니다.

.

난 그냥 THREAD1> CLASS1> 서식있는 텍스트 상자 내가 THREAD2를 사용하여 편집 할 수

을 갖고 싶어

> CLASS2> 내가 THREAD1에 -anything- 편집하지 않도록 버튼 > CLASS1

내가이 Thread1을 할 불가능하면

을 (Thread2이 Thread1이 그것을 기대하지 않고, Thread1에 따라 다름) 의존성을 하나의 방향을, 그 THREAD2 물건 프로그램에 대한 완전한 부가 수 있도록하는 것을 목표로하고 있습니다 Thread2를 모른 채, ca n 적어도 스레드 1의 참여를 최소화합니까?

.

편집 : Delegates 및 기타 관련 물건이 내가 무엇을 원하는지 알 수없는 경우 원하는 코드를 별도의 스레드로 실행하고 각기 독립적 인 코드를 실행하려면 서로 얽혀 있어야합니다. 더 큰 목표를 달성하는 것; 어떤 식 으로든 다른 사람들을 편집하는 것과 같이; 1. 나는 스스로 실행하기 위해 "class MY PROGRAM"을 개발한다. 나중에 나는 addon을 만든다. 2. MY PROGRAM과 섞인 "class MY ADDON" 돌아가서 MY PROGRAM 코드를 편집하여 두 프로그램 간의 통신을 허용해야합니다. C#을 사용할 수없는 경우이를 달성 할 수있는 프로그래밍 언어가 있습니까?

+0

을 제어합니다. 왜 그게 필요하니? 모든 것을 하나의 UI 스레드로 이동하십시오. – usr

+0

내가 그 일을하는 것은 불가능합니다. 두 번째 UI 스레드는 자신의 일을하고 있으며, 제 경우에는 서버입니다. 가능한 한 빨리 답장하고 UI에 상황을 다시 기록해야합니다.이 UI는 신속하게 대응해야합니다. 나는 서버 클래스가 어리석은 UI를 그리기 위해 성능을 잃어 버리는 것을 원하지 않는다. UI를 "너무 복잡하게"하지 않아도 UI에 데이터를 전달하려고 시도하는 것입니다 (다른 스레드의 간단한 메서드 호출과 같은 추가적인 쓰레기는 없습니다). 그러나 데이터 잠금은 불가능합니다. 내가 데이터 잠금을 해제합니까? – AlucardF0X

+0

놀랍습니다. 어떻게 두 번째 UI 스레드가 "서버"가 될 수 있습니까? UI 스레드를 차단해서는 안되기 때문에 UI 스레드가 중단됩니다. 하나의 UI 스레드와 다른 스레드 (예 : "서버"실행)를 수행 할 수 있습니까? UI 컨트롤은 UI 스레드에서만 액세스 할 수 있습니다. 그 이유는 enythign이 정교하기 때문입니다. – usr

답변

-1

이 내가 스레드간에 홉 형태의 응용 프로그램에 사용하고 UI를 변경할 것입니다 *이 여러 스레드에서 UI를하는 프로그램에 대한 특별한 아주 * 그것은이다

Program.MainForm.Invoke((MethodInvoker)delegate { 

    //do changes here 

});'