C# 等待,然后在循环wpf中执行下一个代码
我有一个使用cefsharp下载的下载链接列表。我无法使用webclient下载文件,用户必须登录 这是我的密码:C# 等待,然后在循环wpf中执行下一个代码,c#,wpf,cefsharp,C#,Wpf,Cefsharp,我有一个使用cefsharp下载的下载链接列表。我无法使用webclient下载文件,用户必须登录 这是我的密码: foreach (var lnk in collection) { Console.WriteLine(lnk); await TestAsync(lnk); } private Task TestAsync(string lnk) { return Task.Run(() => TaskToDo(lnk)); } private async v
foreach (var lnk in collection) {
Console.WriteLine(lnk);
await TestAsync(lnk);
}
private Task TestAsync(string lnk) {
return Task.Run(() => TaskToDo(lnk));
}
private async void TaskToDo(string lnk) {
await wb.GetBrowser().MainFrame.EvaluateScriptAsync(String.Format("window.location.href = '{0}'", lnk));
}
在我的循环中,我有一个控制台。WriteLine
来打印链接。在我的程序输出中,它打印所有链接,然后下载一个文件。问题是它只下载最后一个文件。我需要它等待并下载下一个文件
我如何解决这个问题?你的问题是
async void
这不会被调用者阻止,这就是为什么您要执行任务。在不需要时运行
foreach (var item in collection)
{
Console.WriteLine(lnk);
await TestAsync(lnk);
}
private Task TestAsync(string lnk)
{
return TaskToDo(lnk);
}
private Task TaskToDo(string lnk)
{
return wb.GetBrowser().MainFrame.EvaluateScriptAsync(String.Format("window.location.href = '{0}'", lnk));
}
您没有正确使用wait关键字。在本例中,您告诉我们每次迭代循环时都要等待。最好从
TestAsync(lnk)
返回Task
,并将其放在任务列表中
因此,在foreach
循环中,您应该使用Task.WhenAll()
来代替wait
方法来执行以下示例中的所有任务:
List<Task> taskList = new List<Task>();
foreach (var lnk in collection)
{
Console.WriteLine(lnk);
var task = TestAsync(lnk);
taskList.Add(task);
}
await Task.WhenAll(taskList.ToArray());
List taskList=new List();
foreach(集合中的变量lnk)
{
控制台写入线(lnk);
var任务=测试同步(lnk);
任务列表。添加(任务);
}
wait Task.WhenAll(taskList.ToArray());
关于:
问题是它只下载最后一个文件。我需要它等待
并下载下一个文件。
我怎样才能解决这个问题
我怀疑您无法使用window.lotion.href
异步下载文件,因为您正在按顺序更改窗口的位置,并且在上一个操作完成之前
基本上,当您正在下载LINK1另一个任务时,示例LINK3将开始下载,而LINK1将停止。这就是为什么您只下载了一个文件的原因。尝试使用
window.open()
或其他一些不同的技术。您的代码应该始终是异步的,并且不应该阻塞异步代码。有关更多信息,请参阅@Stephen Cleary的MSDN文章:
这里的问题是,您的TestAsync
方法启动一个新的任务
,该任务将在后台线程上执行,并在任务实际完成之前立即返回
您应该使TestAsync
方法async
,并将TaskToDo
方法的返回类型更改为Task
,以便能够等待此返回:
foreach (var lnk in collection) {
Console.WriteLine(lnk);
await TestAsync(lnk);
}
private async Task TestAsync(string lnk)
{
await TaskToDo(lnk);
}
private async Task TaskToDo(string lnk)
{
await wb.GetBrowser().MainFrame.EvaluateScriptAsync(String.Format("window.location.href = '{0}'", lnk));
}
还是老样子,先生。它不会阻止executingawait TestAsync(lnk)中的代码;下载的目的是什么,对吗?是的,长官,代码等待TestAsync(lnk);应该下载文件不要阻塞,只要在上一个项目完成后开始下载下一个项目,使用一个简单的计数器来跟踪您的列表项目,这是我想到的最后一个解决方案,先生,如果我无法实现这一点,您有一个选择
项目的foreach
循环,但是在循环内,lnk从乙醚中出现。项目
和lnk
之间的关系是什么?(kat1330也想知道。)我不相信你的努力会有什么结果work@HABO更新了澄清的代码。我尝试了你的代码,但仍然没有下载其他文件。更新lnk是什么意思?在我的控制台上。WriteLine(lnk);链接彼此不同,并且链接正确。我没有看到更改的逻辑lnk
。不要介意。您是否证明您的逻辑与同步代码一起工作?你愿意那样下载吗?这就是你的意思吗?在循环中,我使用item变量。在我的控制台里我用lnk?很抱歉。我删除了将item的值转换为link的代码。我更新了代码,谢谢你可能window.location.href
总是被首先完成的每个任务覆盖。请看我的最新答案。