2013-03-04 2 views
0

루프의 내용을 내 UI에 표시하려고합니다. 첫째로, 나는이에게 (윈폼 사용) 올바른 방법으로 접근하고있어 확실하지 않다 그러나 이것은 내가 뭘하는지입니다 :ApartmentState 설정에도 불구하고 스레드 오류가 교차합니다.

foreach (string item in stringArray) 
{ 
     Thread thread = new Thread(delegate() 
           { 
            UpdatedResultEvent(item); 
           }); 
     thread.SetApartmentState(ApartmentState.STA); 
     thread.Start(); 
} 

나는이 충분한 정보를 희망하지만, 그 다음이 아닌 경우 여기서 자세히 설명하겠습니다.

내 Program.cs (WinForm) 클래스와 logicClass라는 다른 클래스가 두 개 있습니다. LogicalClass에 프로그램 객체의 인스턴스를 전달합니다. 내 logicClass에는 내 Program 클래스의 메서드와 일치하는 서명이있는 대리인이 있습니다. 델리게이트로 전달되는 방법은 오류 메시지가 유효

스레드 간 동작 아니다

public void UpdateResultsOnScreen(string newContent) 
{ 
txtResults.Text += newContent; 
} 

: 그것은

에 만들어진 스레드가 아닌 다른 스레드 에서 액세스 제어

편집

목표는 방법의 t와 유사하다 그는 진행률 막대 작업을 실시간으로 업데이 트지고 제어를 볼 수 있습니다. 현재 작동하더라도 스레드는 스레드가 완료 될 때까지 '결과'를 화면에 반환하지 않습니다.

답변

1

사용이 (당신이 윈폼에있는 경우) :

또한
public void UpdateResultsOnScreen(string newContent) 
{ 
    txtResults.BeginInvoke(
     new Action<string>((value) => 
     { 
      txtResults.Text += value; 
     }), 
     newContent); 
} 

같은 animaonlineThreadPool 또는 Parallel.ForEach 사용을 고려했다.

+0

정말 좋지만 화면에 내 결과가 실시간으로 표시되지 않습니다. 내 텍스트 상자는 한 번에 하나의 항목을 채우는 대신 모든 것을 한 번에 보여줍니다. 예를 들어, UpdatedResultEvent (item)이 호출 될 때마다 (데이터베이스/webservice 호출 등으로 인해) 5 초가 걸린다고 가정합니다. 이것은 내 화면을 5 초 동안 업데이트하고 싶습니다. – Dave

+0

@DaveRook 수정 한 코드를 사용해보세요. 이전 코드 (Invoke)조차도 예상대로 UI를 작동하고 업데이트해야한다고 생각합니다. 그러나 작동하지 않으면 정확히 어떻게하는지 알 필요가 있습니다. 나는 그것이 또 다른 질문이라고 생각한다. –

+0

그래, 이미 BeginInvoke()를 사용했지만 동일한 결과를 시도했다. 이게 효과가 있다고 생각한다면 어쩌면 저의 디자인에 결함이있는 것일 수도 있습니다! – Dave

1

ApartmentState를 설정하더라도 다른 (UI가 아닌) 스레드에서 액세스 할 때는 UI 컨트롤을 호출해야합니다.

UpdateResultEvent 메서드 내에서 UI 컨트롤을 호출해야합니다.

어쨌든, 당신이하고있는 것은 좋은 생각이 아니다, 사용 생각해 보자 ThreadPool 또는 Parallel.ForEach

그것은 자동으로 컬렉션이 특히, 정말 성능이 저하 될 수있는 스레드의 무리 산란, 코드를 확장 할 수

그것에있는 많은 아이템.

0

어떨까요?

public void UpdateResultsOnScreen(string newContent) 
    { 
     if(txtResults.InvokeRequired) 
     { 
      txtResults.Invoke(
       new Action<string>(content => txtResults.Text += content), newContent); 
      return; 
     } 
     txtResults.Text += newContent; 
    } 
관련 문제