Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 等待,然后在循环wpf中执行下一个代码_C#_Wpf_Cefsharp - Fatal编程技术网

C# 等待,然后在循环wpf中执行下一个代码

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

我有一个使用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 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
总是被首先完成的每个任务覆盖。请看我的最新答案。