我正在重寫一些使用WebBrowser
對象的代碼來確定服務器何時準備好下載文件。總的來說,這種行爲是這樣的,首先將文件上傳到服務器,一旦上傳服務器,然後開始工作,因爲它正在進行工作,它將連接到它服務的特定頁面的用戶重定向到各種URL直到它完成,一次完成後文件就可以下載了。處理任務中的事件;在任務中處理來自WebBrowser的導航事件?
我想所有的這種行爲在一個單一的函數調用,基本上GetFileFromServer()
。一旦這個調用返回,那麼文件就在指定的文件路徑中。
問題是,當使用WebBrowser
我必須處理Navigated
事件以確定文件何時可以下載,這將使程序流離開GetFileFromServer
函數。我可能只是有一個小while循環
while(fileNotDownloaded)
Thread.Sleep(500);
但我想用一個Task
代替該功能看起來像
public void GetFileFromServer()
{
UploadFile(); // Blocks until file is uploaded
DownloadFile(); // Blocks until file is downloaded
}
我已經實現UploadFile
但同樣,因與問題DownnloadFile
。基本上我想我的功能看起來像這樣
private void DownloadFile()
{
var DoWebDriverTask = Task.Factory.StartNew(() =>
{
Boolean fileReady = false;
WebBrowser webBrowser = new WebBrowser();
webBrowser.Url = new Uri(MySpecificIP);
webBrowser.Navigated += WebBrowserNavigated;
// Sit and Spin until the specific URL is navigated to
while(!fileReady)
Task.WaitAll(new Task[] { Task.Delay(500) });
DownloadFile();
private void WebBrowserNavigated(object sender, WebBrowserNavigatedEventArgs e)
{
if(e.Url.AbsoluteUri.ToString().Contains("mySpecificURLString"))
fileReady = true;
}
}, CancelWaitForDownloadTaskToken);
Task.WaitAll(new Task[] { WebDriverTask });
}
但是,這顯然是不正確的代碼。我也明白這是我上面提供的同樣的解決方案,但只是搬進了Task
,但它確實給了我想要的GetFileFromServer
以外的行爲。請注意,UI線程中沒有這樣的情況,因此,我上面提供的解決方案仍然可行...但使用Task
如果用戶希望,我可以取消等待下載。
那麼我是否有辦法處理Task
中的事件Navigated
,正如我在上面的代碼中所描述的那樣?
我認爲你應該使用[TaskCompletionSource(https://msdn.microsoft.com/en-us/library/dd449174%28v=vs.110%29.aspx) –
或者您可以將'WebBrowserNavigated'轉換爲lambda表達式。但使用'TaskCompletionSource'更好。 –