2017-02-25 8 views
0

이 코드는 웹 페이지에서 정보를 취해야합니다. 내 문제는 그것이 correnctly 표시하지 않는 이유를 모르겠다는 것입니다.C# 변수는 값이 결정되기 전에 사용됩니다.

어떻게 든 문서 완성을 기다리지 않고 그 밖의 기능을 만들지 않고 만들고 싶습니다.

나는 큰 파일에서 수정하려는 실제 코드 :

public static string GetNews() 
{ 
    WebBrowser page = new WebBrowser(); 
    string data = null; 
    page.Navigate(launcherScriptAddress); 
    page.DocumentCompleted += delegate { 
    data = page.Document.GetElementById("news").InnerText; 
     // can't return `data` from here 
    }; 
    return data; // returns null because it doesn't wait for document to be completed 
} 
+2

당신나요 : 당신은이 방법으로 호출 할 수 있습니다 그 후

public delegate void NewsCallback(string dataReceived); public static void GetNews(NewsCallback callback) { WebBrowser page = new WebBrowser(); string data = null; page.Navigate(launcherScriptAddress); page.DocumentCompleted += delegate { data = page.Document.GetElementById("news").InnerText; callback(data); }; } 

을 'Delegate' 함수 안에'MessageBox.Show'를 넣으시겠습니까? –

답변

1

이 당신이 그것을 수행하려고 할 방법을 작동하지 않습니다. 당신의 함수는 page.DocumentCompleted-delegate가 실행되기 전에 되돌려줍니다.

그래서 할 수있는 것은 GetNews 함수에 콜백을 전달하여 위임자 내에서 실행되도록하는 것입니다.

동기화 문제가있는 < -> 비동기입니다.

게다가, .Navigate와 .DocumentCompleted + = 문을 교환해야합니다. "page"에 콜백 세트가 있는지 확인한 후에로드하기 시작해야합니다.

[편집] 당신이 대리인을 작성하고 기능을 변경해야합니다, 그렇게하려면

void CallMyNews(){ 
    GetNews((dataReceived) => { 
     DoSomeStuffWith(dataReceived); 
    }); 
} 
+0

오 .. 어떻게해야합니까? – jeaks

+0

여기 작업을 수행하는 데 약간의 작업이 필요하므로 그에 맞게 답변을 편집합니다. – Psi