2014-09-16 1 views
0

내가 버튼을 내가 두 FirstNames라스트 네임 검색하고윈폼은 UI : 비동기 사용/기다리고 및 ADO.NET

private async void btnSearch_Click(object sender, EventArgs e) 
{ 
    lblSearchStatus.Text = "Searching..."; 

    await FetchFirstNames(); 
    lblSearchStatus.Text = "searching for First Name"; 
    await FetchLastNames(); 
    lblSearchStatus.Text = "searching for Last Name"; 
} 

을 클릭하는 위치 WinFormsasyncawait을 배우려고 노력하고 있어요 내가 전화하고 싶은 다른 방법은 asynchronously. ---> "이름 검색" "... 검색"

private async Task FetchFirstNames() 
{ 
    ... 
    using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     SqlCommand command = new SqlCommand(queryString, connection);  
     SqlDataAdapter dap = new SqlDataAdapter(command); 
     DataTable tblMatches = new DataTable(); 
     await Task.Run(() =>dap.Fill(tblMatches)); //it takes about 5s to complete.     
     ... 
     lblSearchStatus.Text = tblMatches.Rows.Count.ToString() + " first names found.";   
    } 
} 

을 내 의도가 lblSearchStatus의 텍스트에서 변경해야한다는 것입니다 버튼을 클릭에 : 두 가지 방법이 유사하고 코드는 다음과 같이 간다 ---> "성을 검색 중"---> "123 성/이름을 찾았습니다." 그러나 내가 그것을 실행할 때 레이블은 "Searching .."에서까지 "123 성/이름을 찾았습니다"에서 바로 바뀝니다.
어디서 잘못 가고 있습니까?

+0

메시지는 결과가 계산되었음을 나타냅니다. 이게 5 초가 걸릴거야? – usr

+0

예 3-6s 사이의 값이면 레이블의 텍스트 변경 사항을 볼 수있을 정도로 길습니다. "검색 중 ..."에서 텍스트가 멈추고 "123 개의 이름이 발견되었습니다" – Luftwaffe

+0

동결 중에 디버거를 일시 중지합니다. 실행중인 항목은 무엇입니까? – usr

답변

0

이것은 늦었지만 답변을 찾는 다른 사용자에게 도움이 될 수 있습니다. 아직 100 % 확신 할 수는 없지만 UI 스레드가 차단되어있는 것처럼 보이므로 레이블이 새로 고쳐지지 않아서 "Task.Run"은 다른 스레드를 사용하여 리소스를 많이 사용하는 프로세스를 실행합니다.

private async void button1_Click(object sender, EventArgs e) 
{ 
    lblSearchStatus.Text = "searching for First Name--"; 

    Task task1 = Task.Run(() => FetchFirstNames()); 
    await task1; 

    lblSearchStatus.Text = lblSearchStatus.Text + " searching for Last Name-"; 
    Task task2 = Task.Run(() => FetchLastNames()); 
    await task2; 

    lblSearchStatus.Text = lblSearchStatus.Text + " ---- All Done ----"; 
} 

private async Task FetchFirstNames() 
{ 
    string str1 = ""; 

    lblSearchStatus.Text = lblSearchStatus.Text + " Start first name -"; 

    for (int i = 0; i < 100000000; i++) 
    { 
     str1 = i.ToString(); 
    } 

    lblSearchStatus.Text = lblSearchStatus.Text + " first name: i=" + str1; 
} 

private async Task FetchLastNames() 
{ 
    string str1 = ""; 

    lblSearchStatus.Text = lblSearchStatus.Text + " Start Last name -"; 

    for (int i = 0; i < 100000000; i++) 
    { 
     str1 = i.ToString(); 
    } 

    lblSearchStatus.Text = lblSearchStatus.Text + " last name: i=" + str1; 
}