我正在重写一些使用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'更好。 –