2013-08-30 1 views
4

미국에서 호스팅되는 라이브 WCF 서비스가 있습니다. 전 세계 모든 곳에서 사용할 수있는 Windows Forms 응용 프로그램에서이 응용 프로그램에 액세스하려고합니다. 현재 인도에서 테스트 중이며 미국 내 호스팅 웹 서비스에 액세스하려고합니다. 이 응용 프로그램은 모든 연결 속도와 서버에서 멀리 떨어진 곳에서 사용할 수 있습니다. 따라서 서버의 응답 속도가 다를 수 있습니다. 내가 결정한 것은 사용자가 일부 기능을 수행 할 때 응용 프로그램이 UI를 먼저 업데이트 한 다음 백그라운드에서 서버 업데이트 작업을 수행한다는 것입니다. 이렇게하면 응용 프로그램이 멈추거나 매달릴 수 없습니다. 다음은 이러한 시나리오 중 하나입니다. 하지만 문제는 비동기 함수와 스레드를 사용하여 UI와 서버를 업데이트 할 때도 응용 프로그램이 여전히 멈추고 있다는 것입니다.인터넷 속도가 낮고 멀리 떨어진 WCF 웹 서비스를 사용하는 Windows Forms 클라이언트의 사용자 환경 개선

실제로 저는 좋아하는 것과 그렇지 않은 것 사이에서 토글하는 역할을하는 버튼이 있습니다. 사용자가 그것을 클릭하면, 그것을 달리로 변경해야합니다 그리고 그것은 백그라운드에서 서버를 업데이 트하는 스레드를 실행합니다. 버튼의 클릭 이벤트에 대한 코드는 다음과 같은 :

async private void btnLike_Click(object sender, EventArgs e) 
{ 
     new System.Threading.Thread(new System.Threading.ThreadStart(changeLike)).Start(); 
     await LikeContent(); 
} 

changeLike 기능 :

private void changeLike() 
{ 
    if(btnLike.Text.Equals("Like")) 
      btnLike.Text="Unlike"; 
    else 
      btnLike.Text="Like"; 
} 

LikeContent 기능 :

async Task<int> LikeContent() 
{ 
     await Global.getServiceClient().addContentLikeAsync(cid, uid); 

     System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(reloadLikes)); 
     t.Start(); 
     return 0; 
} 

addContentLikeAsync() 기능은 사용자의 취향을 업데이트하는 WCF 웹 서비스 기능입니다 서버에. reloadLikes()은 사용자가 콘텐츠를 좋아 한 후에 서버에서 좋아요 수를 업데이트합니다.

내 코드를 수정하면 응용 프로그램이 잠시 얼어서 LIKE 버튼을 업데이트하는 대신 LIKE 버튼을 즉시 업데이트 할 수 있습니다. 이 "언젠가"는 인터넷 속도가 떨어지는 사용자에게 나쁜 인상을 남길 것입니다.

+1

귀하의'changeLike()가'스레드에 적합하지 않습니다, 당신은 확신이 확인을 실행 reloadLikes()? –

+0

왜 새 스레드에서'changeLike()'를 호출합니까? 그냥 직접 부르세요. –

+1

작업을 위해 전용 스레드가 필요하지 않는 한 스레드 생성은'ThreadPool'과'Tasks'를 위해 피해야합니다. 너는하지 않는다. – user2586804

답변

3

먼저 UI 스레드에서 btnLike_Click 메서드가 호출된다고 가정합니다. 이 경우 changeLike()을 별도의 스레드에서 호출하지 마십시오.

async private void btnLike_Click(object sender, EventArgs e) 
{ 
     changeLike(); 
     await LikeContent(); 
} 

둘째, 전에 다시 UI 스레드에 마샬링해야

async Task<int> LikeContent() 
{ 
     await Global.getServiceClient().addContentLikeAsync(cid, uid); 

     // Ensures this occurs on the UI thread - WinForms 
     Invoke((Action)reloadLikes); 

     return 0; 
} 
+0

감사합니다. @EdChapel. 코드에 따라 코드를 수정했습니다. 그 위대한 일. 감사 :) –

관련 문제