2011-03-04 3 views
4

WatiN을 사용하여 웹 사이트를 구문 분석합니다. 그 과정을 시작하는 버튼이 있습니다. 브라우저 창을 열고 이동해야하는 곳으로 이동 한 다음 DoWork이라는 메서드를 호출하는 새 작업을 만듭니다.C# 도움말 작업 클래스

DoWork 끝에 새 메서드를 호출하면이 새로운 메서드를 호출하지 않으면 프로그램에서 내 웹 사이트를 탐색하려고 할 때 이상한 결과가 나타납니다. DoWork 그리고 버튼을 클릭하여 새 메서드를 연결하면됩니다. 그래서 내 질문은 제대로 배경 프로세스 메서드에서 새 메서드를 호출하지 오전, Dowork?

코드 :

IE browser = new IE("http://www.mywebsite.com/"); 
    string startYear; 
    string endYear; 
    int NumRows; 
    Task myThread; 
    public Form1() 
    { 
     InitializeComponent(); 

    } 

    private void Start_Click(object sender, EventArgs e) 
    { 
     startYear = txtStartYear.Text; 
     endYear = txtEndYear.Text; 
     //website navigation work removed for brevity 

     browser.Button(Find.ById("ContentPlaceHolder1_btnApplyFilter")).Click(); 


     int numRows = browser.Div(Find.ById("scroller1")).Table(Find.First()).TableRows.Count -1; 
     NumRows = numRows; 
     lblTotalRows.Text = numRows.ToString(); 
     myThread = Task.Factory.StartNew(() => DoWork()); 


    } 
    public void DoWork() 
    { 
     List<string> myList = new List<string>(NumRows); 
     txtStartYear.Text = startYear; 
     txtEndYear.Text = endYear; 

     for (int i = 1; i < NumRows; i++) 
     { 
      TableRow newTable = browser.Div(Find.ById("scroller1")).Table(Find.First()).TableRows[i]; 
      string coll = string.Format("{0},{1},{2},{3},{4}", newTable.TableCells[0].Text, newTable.TableCells[1].Text, newTable.TableCells[2].Text, newTable.TableCells[3].Text, newTable.TableCells[4].Text); 
      myList.Add(coll); 

      label1.Invoke((MethodInvoker)delegate 
      { 
       label1.Text = i.ToString(); 
      }); 
     } 
     //database work removed for brevity. 

     browser.Button(Find.ById("btnFilter")).Click(); 

     newMethod(); 


    } 
    public void newMethod() 
    { 

     int start = int.Parse(startYear); 
     start++; 
     startYear = start.ToString(); 

     int end = int.Parse(endYear); 
     end++; 
     endYear = end.ToString(); 

     browser.SelectList(Find.ById("selStartYear")).SelectByValue(startYear); 
     browser.SelectList(Find.ById("selEndYear")).SelectByValue(endYear); 

    //removed for brevity 

    } 

} 

내가 선 browser.SelectList(Find.ById("selStartYear")).SelectByValue(startYear)가 제대로 작동하지 않는 Dowork에서 newMethod를 호출하는 경우, 반복,하지만 난 Dowork에서 newMethod에 대한 호출을 제거하고 경우 단지 버튼 그것까지 newMethod 후크 잘 작동합니다. 그것이 배경 작업이 DoWork과 관련이 있는지 궁금하네요?

올바르게 동작하지 않는다고 말하면 드롭 다운 목록에서 항목을 선택하면 페이지 자동 게시가 다시 시작되지만 위의 코드 줄에서는 선택되지만 페이지는 다시 게시되지 않습니다. 가능해서는 안됩니다. DoWork 안에 메서드를 호출하지 않으면이 문제가 발생하지 않습니다.

답변

2

UI가 아닌 스레드에서 UI 요소를 수정하고 있습니다. DoWork 내에서 Douch 코드를 이미 처리 했으므로 Control.Invoke을 통해 - newMethod에 대해 동일한 작업을 수행해야합니다. 것입니다하지만 label를 사용하여 - 내가 브라우저 자체가 "정상"제어인지 모르겠어요으로 (내가 label.BeginInvoke

// At the end of DoWork 
Action action = newMethod; 
label.BeginInvoke(action); 

사용하고

: 그것은 아마 UI 스레드에서 모든 메소드를 호출하는 가장 쉬운 것 어쨌든 올바른 스레드를 얻으십시오. browser.BeginInvoke이 컴파일되면 더 명확 해집니다.)

+0

sokyo soooo much ... 그래서 처음부터 ui 요소를 수정하지 않았다면 여전히 newMethod를 호출해야합니까? –

+0

@Nick : 특정 스레드에 있어야하는 다른 작업을 수행하지 않는다고 가정하면 괜찮습니다. –

+0

답을 편집하고 마지막 비트를 추가해 주셔서 감사합니다. 또한 브라우저를 사용해 보았지만 작동하지 않습니다. 그것은 WatiN core를 말합니다 .IE에는 Invoke에 대한 정의가 없으므로 답변이 있습니다. –

0

선택 목록 컨트롤에 문제가 있다고 생각됩니다. 웹 사이트를 탐색 할 때 가끔 키보드로 항목을 드롭 다운합니다. 마우스를 사용하면 항상 포스트 백을 보장하는 반면 가끔은 포스트 백이 발생하지 않습니다.

나는 여분의 버튼을 넣는 것이 더 좋을 수도 있고 포스트 백을 호출하는 것의 browser.Button(Find.ById("btnFilter")).Click(); 종류를 수행 할 것이라고 생각합니다.

브라우저의 함수가 적절한 크로스 스레드 검사를 수행하지 않는 경우 어떤 Jon Skeet이 도움이 될 것이라고 말했습니다.

+0

제안에 감사드립니다. Jon의 답변이 내 문제를 해결했습니다. –