gpt4 book ai didi

c# - 任务没有第二次完成 [间歇性问题] – 异步/等待

转载 作者:太空宇宙 更新时间:2023-11-03 13:24:39 26 4
gpt4 key购买 nike

我有一个 WebBrowser 控件是 Windows 窗体项目。它浏览“MyTableTest.html”中所有可用的 url。此页面中有四个 url,网络浏览器逐一浏览。一旦到达最后一个,它应该再次转到第一个。它在第一次迭代中运行良好——但在第二次迭代中无法访问 url。这是一个间歇性问题 - 某些时候它会起作用。

似乎(从日志中)他等待的任务没有完成。可以做些什么来使其在第二次迭代中也能正常工作?

注:下面给出MyTableTest.html

注意:这是基于帖子 Get ReadyState from WebBrowser control without DoEvents

问题

       startNavigation();

WriteLogFunction("Location 1");

// wait for DOM onload event, throw if cancelled
await onloadTcs.Task;

//ISSUE: Not reaching this location at second time navigation
WriteLogFunction("Location 2");

代码

public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Load += MainForm_Load;
}

List<string> visitedProducts = new List<string>();
string nextNavigationUrl = String.Empty;

// Form Load event handler
async void MainForm_Load(object sender, EventArgs e)
{
// cancel the whole operation in 20 sec
var cts = new CancellationTokenSource(20000);

//urlStore.Add(@"C:\Samples_L\MyTableTest.html");
nextNavigationUrl = GetHomoePageUrl();
await NavigateInLoopAsync(cts.Token);
}

// navigate to each URL in a loop
async Task NavigateInLoopAsync(CancellationToken ct)
{

bool isIterationComplete = false;

while (!isIterationComplete)
{

string url = String.Empty;

if (String.IsNullOrEmpty(nextNavigationUrl))
{
WriteLogFunction("Close");
isIterationComplete = true;
}
else
{
url = nextNavigationUrl;
ct.ThrowIfCancellationRequested();


WriteLogFunction("Calling NavigateAsync");

Action startNavigation = () => this.webBrowser1.Navigate(url);
var html = await NavigateAsync(ct, startNavigation);


}
}
}

// asynchronous navigation
async Task<string> NavigateAsync(CancellationToken ct, Action startNavigation)
{
var onloadTcs = new TaskCompletionSource<bool>();
EventHandler onloadEventHandler = null;

WriteLogFunction("Inside Function NavigateAsync");

WebBrowserDocumentCompletedEventHandler documentCompletedHandler = delegate
{
// DocumentCompleted may be called several time for the same page,
// if the page has frames
if (onloadEventHandler != null)
return;

// so, observe DOM onload event to make sure the document is fully loaded
onloadEventHandler = (s, e) =>
onloadTcs.TrySetResult(true);
this.webBrowser1.Document.Window.AttachEventHandler("onload", onloadEventHandler);
};

this.webBrowser1.DocumentCompleted += documentCompletedHandler;

try
{
using (ct.Register(() => onloadTcs.TrySetCanceled(), useSynchronizationContext: true))
{
startNavigation();

WriteLogFunction("Location 1");

// wait for DOM onload event, throw if cancelled
await onloadTcs.Task;

//ISSUE: Not reaching this location at second time navigation
WriteLogFunction("Location 2");
}
}
finally
{
this.webBrowser1.DocumentCompleted -= documentCompletedHandler;
if (onloadEventHandler != null)
this.webBrowser1.Document.Window.DetachEventHandler("onload", onloadEventHandler);
}

WriteLogFunction("Place 3");

// the page has fully loaded by now

// optional: let the page run its dynamic AJAX code,
// we might add another timeout for this loop
do { await Task.Delay(500, ct); }
while (this.webBrowser1.IsBusy);

//Call Processing -- Added By Lijo
ExerciseApp(this.webBrowser1, null);

// return the page's HTML content
return this.webBrowser1.Document.GetElementsByTagName("html")[0].OuterHtml;
}

private void ExerciseApp(object sender, WebBrowserDocumentCompletedEventArgs e)
{
WriteLogFunction("ExerciseApp");
var wb = sender as WebBrowser;
int catalogElementIterationCounter = 0;
var elementsToConsider = wb.Document.All;
string productUrl = String.Empty;
bool isClicked = false;

foreach (HtmlElement e1 in elementsToConsider)
{

catalogElementIterationCounter++;

string x = e1.TagName;
String idStr = e1.GetAttribute("id");

if (!String.IsNullOrWhiteSpace(idStr))
{
//Each Product Navigation
if (idStr.Contains("catalogEntry_img"))
{
productUrl = e1.GetAttribute("href");
if (!visitedProducts.Contains(productUrl))
{
WriteLogFunction("productUrl -- " + productUrl);
visitedProducts.Add(productUrl);
isClicked = true;

//e1.InvokeMember("Click");
nextNavigationUrl = productUrl;

break;
}

}
}
}

WriteLogFunction(visitedProducts.Count.ToString());
WriteLogFunction(nextNavigationUrl);

if (visitedProducts.Count == 4)
{
WriteLogFunction("Condition B");
visitedProducts = new List<string>();
}

if (!isClicked)
{
WriteLogFunction("Condition C");
nextNavigationUrl = GetHomoePageUrl();
}
}

private void HomoePageNavigate()
{
webBrowser1.Navigate(GetHomoePageUrl());
}

private string GetHomoePageUrl()
{
return @"C:\Samples_L\MyTableTest.html";
}

private void WriteLogFunction(string strMessage)
{
using (StreamWriter w = File.AppendText("log.txt"))
{
w.WriteLine("\r\n{0} ..... {1} ", DateTime.Now.ToLongTimeString(), strMessage);
}
}



}

MyTableTest.html

<html>
<head>

<style type="text/css">
table {
border: 2px solid blue;
}

td {
border: 1px solid teal;
}
</style>

</head>
<body>

<table id="four-grid">
<tr>
<td>
<a href="https://www.wikipedia.org/" id="catalogEntry_img63666">

<img src="ssss"
alt="B" width="70" />
</a>
</td>
<td>
<a href="http://www.keralatourism.org/" id="catalogEntry_img63667">

<img src="ssss"
alt="A" width="70" />
</a>
</td>
</tr>
<tr>
<td>
<a href="https://stackoverflow.com/users/696627/lijo" id="catalogEntry_img63664">

<img src="ssss"
alt="G" width="70" />
</a>
</td>
<td>
<a href="http://msdn.microsoft.com/en-US/#fbid=zgGLygxrE84" id="catalogEntry_img63665">

<img src="ssss"
alt="Y" width="70" />
</a>
</td>
</tr>

</table>
</body>

</html>

最佳答案

"Location 1" is printed but not "Location 2". What is your suggestion to overcome this? Were you able to reproduce this issue?

我没有尝试重现,但就像我在评论中所说的那样,很明显 DocumentCompletedwindow.onload 不会针对该特定 URL 被触发.如果页面无法完全加载,或者例如如果 URL 无效或服务器变得不可访问。这就是超时逻辑的用途。

documentCompletedHandler开头多放一根,在onloadEventHandler里多放一根:

onloadEventHandler = (s, e) => { Log("inside onloadEventHandler");
onloadTcs.TrySetResult(true); }

看看什么被解雇了,什么没有。

此外,你还应该实现WebBrowser Feature Control启用现代 IE 功能。这通常也会影响网页的加载方式。从 here 复制 SetFeatureBrowserEmulation .

关于c# - 任务没有第二次完成 [间歇性问题] – 异步/等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22814016/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com