Microsoft MVP성태의 닷넷 이야기
[C# 6.0]multi threading과 ui control [링크 복사], [링크+제목 복사],
조회: 11649
글쓴 사람
힘찬도약 (kssjjw71 at hanmail.net)
홈페이지
첨부 파일
 


 안녕하세요.
 C# 6.0 프로그래밍 책 잘 보고 있습니다.

 제가 지금 개발하고 있는 프로그램은 여러개의 서버에 비동기적으로 접속해서 Packet을 주고 받는 Client프로그램입니다. C#6.0 프로그래밍 10.2.4장 비동기 호출의 병렬처리(675page) 파트 등을 봤습니다만, 본 문제 해결 방법을 잘 못찾겠어서 이렇게 질문드립니다.

Main class에서 serverSockets 객체10개를 생성하고 각각 스레드로 돌아가면서 서버와 데이터를 주고 받는데,
10개의 각각의 스레드에서 주고 받는 데이터를 Main class의 listbox에 출력, 로깅이 가능한지요?
제가 했을 때는, 충돌이 나거나 데이터가 출력이 안되거나 하더라구요.
혹시 해결방법을 알려주시면 감사하겠습니다.








[최초 등록일: ]
[최종 수정일: 10/18/2015]


비밀번호

댓글 작성자
 



2015-10-18 05시35분
일단, UI 요소는 그것을 만든 스레드에서 접근해야 한다는 것만 지켜주시면 됩니다. listbox에 출력이 안된다고 했는데요. 그런 경우 다음과 같이 해보세요.

listbox.Invoke(
    (Action)(() =>
    {
      lstEvent.Items.Add(DateTime.Now + ": " + text);
    }));
정성태
2015-10-18 06시07분
다음의 글을 참고하세요.

[스크랩] Invoke , BeginInvoke, MethodInvoker
; http://www.moros.kr/134
정성태
2015-10-18 07시09분
답변 감사드립니다. 사이트를 보았는데요, 제가 처한 상황에 적용이 잘 안되서요..
  제가 초보이고, 이 부분 해결이 너무 절실한 상황에서 너무 어려워서 그러는데요,
  조금만 더 봐주시고 방법을 좀 제시해주면 안될까요?
  
  코드를 붙여보면, Form1 class가 있고, Form1 class로부터 상속받는 SocketNetworks class가 있는데,
  SocketNetworks class의 TimerCallBack()함수에서 listBox(logOut)에 데이타를 출력하는 방법을 도저히 모르겠어서요.

using System;
 using System.Collections.Generic;
 using System.Threading;
 using System.Windows.Forms;

 namespace jjwThread
 {
     public partial class Form1 : Form
     {
         public Form1()
         {
             InitializeComponent();
         }
         public void Form1_Load(object sender, EventArgs e)
         {
             Thread[] ThreadArr =
             {
                 new Thread(new ThreadStart(Do_Work1)),
                 new Thread(new ThreadStart(Do_Work2)),
             };
             foreach(Thread t in ThreadArr)
             {
                 t.Start();
             }
             logOut.Items.Add(logOut.InvokeRequired);
             logOut.Items.Add(this.Handle);

             List<SocketNetworks> lstServers = new List<SocketNetworks>();

             lstServers.Add(new SocketNetworks("127.0.0.1", 1111));
             lstServers.Add(new SocketNetworks("127.0.0.1", 2222));
             for (int i = 0; i < lstServers.Count; i++ )
             {
                 lstServers[i].SockMainFunc();
             }
             
         }
         private void Do_Work1() // << 잘됨
        {
             //logOut.Items.Add("work1");
             logOut.Items.Add(string.Format("work1: {0}",logOut.InvokeRequired));
             logOut.Items.Add(string.Format("work1_Handle: {0}",this.Handle));
         }
         private void Do_Work2() // << 잘됨
        {
             //logOut.Items.Add("work2");
             logOut.Items.Add(string.Format("work2: {0}", logOut.InvokeRequired));
             logOut.Items.Add(string.Format("work2_Handle: {0}", this.Handle));
         }

     }// end of class Form1

     public class SocketNetworks : Form1
     {
         public string serverIP { get; set; }
         public int serverPort { get; set; }
         private System.Threading.Timer timeGuide;
         public SocketNetworks(string serverIP, int serverPort) {
             this.serverIP = serverIP;
             this.serverPort = serverPort;
         }
         public void SockMainFunc() {
             timeGuide = new System.Threading.Timer(TimerCallBack);
             timeGuide.Change(0, 1000 * 2);
         }

         private void TimerCallBack(object obj)
         {
             logOut.Items.Add(string.Format("TimerCallBack_Handle: {0}", this.Handle)); <<<<<<<<< ?
             // logOut 자체를 인식하지 못해서 컴파일 에러

            logOut.Invoke( <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ?
              (Action)(() => {
                  lstEvent.Items.Add(DateTime.Now + ": " + text);
              }));

             int i=0;
             i++;
             if(i>3000) i=0;
         }
     }
 }

힘찬도약
2015-10-19 12시39분
logOut 자체를 인식하지 못하는 것은 Form1에 정의된 해당 변수가 private으로 선언되어 있어서 그럴 것입니다. 이럴 때는 Form1에 logOut을 노출해주는 protected나 public의 속성을 정의해 주시면 됩니다. 일단 그렇게 하면 컴파일은 되고... 하지만 TimerCallBack 메서드에서 실행시 예외가 발생할 것입니다. 그건 이 질문의 첫번째 답변과 관계 있으니 다시 한번 잘 읽어보시고 그래도 모르시겠으면 한번 더 질문을 주세요.
정성태
2015-10-19 04시21분
[힘찬도약] logOut이 public으로 잡으니 컴파일이 되었습니다. 당연하지만, 실력이 미천해서... 몰랐습니다. ^^

class Form1 안에 다음과 같은 로깅함수를 만들어 놓고,
TimerCallback에서 Log_Out("제발..."); 함수를 부르면 listbox에 안찍히는데요,
찍어야 디버깅이 되는데.. 제발 도와주세요...

public void Log_Out(string strLog)
{

   if(this.InvokeRequired)
   {
      this.Invoke(new MethodInvoker(
           delegate()
          {
            logOut.Items.Add(strLog);
          }
       )
       );
    }
    else
    {
       logOut.Items.Add(strLog);
    }
  }
[guest]
2015-10-19 08시06분
[spowner] 방장님이 답변을 드리기 모호한 지점에 있는 것 같습니다.
Invoke를 떠나서 "Log_Out" 메소드가 호출은 되는지 확인해보세요. 아마 정황상 "log_Out"메소드 자체가 호출 안되는 것 처럼 보이는데 그 이유는 별개의 이유입니다.
[guest]
2015-10-19 09시14분
[힘찬도약] 브레이크포인트 잡고 런(스텝)시키면 들어옵니다. 들어는 오는데, this.InvokeRequired가 false여서(-> ?) 밑에 구문을 탑니다. 그런데 listbox에는 출력이 안됩니다.
[guest]
2015-10-19 10시46분
@힘찬도약 님, InvokeRequired가 false면 스레드 문제는 아닌데요. 재미있군요. ^^ 혹시, 재현가능한 최소한의 소스를 첨부해주시겠어요.
정성태
2015-10-19 12시16분
수정으로 첨부파일이 안올라가서,
답변 글로 첨부파일 올렸습니다.
힘찬도약

... 46  47  48  49  50  51  52  53  54  55  56  57  58  [59]  60  ...
NoWriterDateCnt.TitleFile(s)
1151황기동6/5/201311356무선 패킷 전송관련 질문 [1]
1147이진권6/2/201311372c# 윈폼 facebook과 연동2 [1]
1144황은영5/29/201315870원격지 서버에서 COM+ 호출이 되지 않습니다. [7]
1143김선희5/28/201316789윈도우 8, 익스플로러 10, 64bit->32bit [1]
1142백지훈5/15/201311215음성인식 TTS 관련해서 질문드립니다 ㅜㅜ [2]파일 다운로드1
1141나그네5/10/201311298안녕하세요..전자세금 관련하여.. 보다보다 여기까지 왔습니다. [4]
1140이성환5/8/201311484제네릭과 배열 관련 기초 질문입니다. [11]
1139양영석5/3/201310041페이스북 로그인 관련하여.... [1]
1137김민현4/30/201310083Binary 구조체에 대한 Linq query 관련 질문입니다. [3]파일 다운로드1
1136박상영4/25/201310976ksc5601에서 지원하지않는 확장문자 찾는방법 [3]
1135sequ...4/16/201326531c# dll c++ 에서 사용하기 (event 사용) [17]
1134이성환4/12/201310737volatile 키워드 관련 질문입니다. [3]파일 다운로드1
1133서광석4/8/201313955vb.net 2010에서 배포시 문제점 확인 방법에 대한 질문드립니다 [1]
1131헤딩3/28/201316250IIS 처리 성능을 높이고 싶으면 풀의 proecss 수를 계속 늘리면 될까요? [1]
1130박재율3/27/201310526WCF 서비스가 종종 죽는데 도움좀 부탁드립니다 ㅠ [1]
1129이상민3/21/201314879안녕하세요...IE Embedded Smart Client가 Windows8에서 정상동작을 하지 않습니다. [8]
1125박홍균3/19/20139076안녕하십니까. visual studio 에서 TFS 접속 관련으로 궁금한 점 여쭤봅니다.
1124궁금이3/18/201312115IIS 서버 이중화 구성시 데이터 베이스 트랜잭션 관리에 관해서... [1]
1127궁금이3/19/20139508    답변글 [답변]: IIS 서버 이중화 구성시 데이터 베이스 트랜잭션 관리에 관해서...(정성태님 봐주세요)
1122김시현3/11/201310947 Xamarin 에 관련하여 질문드립니다. [4]
1121롬메달2/14/201311045Assembly.Load로 얻은 객체안에서 제3의 어셈블리를 참조할때의 문제입니다. [8]
1120Lyn2/12/201310565안녕하세요. 블로그에 기술관련글을 꾸준히 포스팅 하실 수 있는 원동력이 궁금합니다. [1]
1119박진영2/4/201334059닷넷 DLL 실행 에러 (보호된 메모리를 읽거나 쓰려고 했습니다..) [2]파일 다운로드1
1118C#조으다1/29/201312120공유기 관리 페이지에 접근시 윈도우 인증창이 뜹니다. [4]
1117최윤호1/28/20139894답변주셔서 감사합니다 질문의 요지는 그게 아니고 [1]파일 다운로드1
1116C#조으다1/27/201317098비프음을 컴퓨터 내장 스피커로 출력하려면.. [2]
... 46  47  48  49  50  51  52  53  54  55  56  57  58  [59]  60  ...