2017-02-15 39 views
3

我有一个下载链接列表,我正在使用cefsharp进行下载。我不能为了下载文件使用Web客户端,用户必须登录等待循环执行下一个代码wpf

这里是我的代码:

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)); 
} 

在我的循环,我有一个Console.WriteLine打印链接。在我的程序输出中,它会打印所有链接,然后下载一个文件。问题是它只下载最后一个文件。我需要它等待并下载下一个文件。

我该如何解决这个问题?

+0

不要堵塞,刚开始下载的下一个项目时,以前的完成后,使用一个简单的计数器来跟踪哪个列表项目您的upto – amaitland

+0

这是我记住的最后一个解决方案如果我不能做这项工作 –

+0

您有一个'foreach'循环选择一个'item',但在循环内从以太网出现'lnk'。 'item'和'lnk'之间的关系是什么? (kat1330也想知道。) – HABO

回答

0

你的问题是

async void 

不会调用者,这就是为什么你做Task.Run当你不需要封锁。

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)); 
    } 
+0

其仍然是同一先生。它不会阻止代码执行 –

+0

等待TestAsync(lnk);是应该做什么下载,对吧? –

+0

是的,先生,代码等待TestAsync(lnk);应该下载文件 –

0

您没有正确使用await关键字。在这种情况下,你告诉你每次迭代循环都要等待。最好从TestAsync(lnk)返回Task并放在任务列表中。

所以,相反在foreach循环await方法,你应该在下面的例子中使用Task.WhenAll()所有任务,如:

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()); 

关于:

的问题是,它仅下载的最后一个文件。我需要它等待 并下载下一个文件。 我该如何解决这个问题?

我怀疑你不能异步下载带有window.lotion.href的文件,因为你要在上一次操作完成之前顺序地改变窗口的位置!

基本上,当您正在下载LINK1的另一个任务时,例如LINK3将开始下载并且LINK1将停止。这就是为什么你只有一个文件下载的原因。尝试使用window.open()或不同的一些不同的技术。

+0

我试过你的代码,但它仍然没有下载其他文件。通过更新lnk,你的意思是什么?在我的Console.WriteLine(lnk);链接是不同的,链接是正确的 –

+0

我没有看到改变'lnk'的逻辑。没关系。你是否证明你的逻辑能够与同步代码一起工作?你喜欢下载吗? – kat1330

+0

这是你的意思?在我的循环中我使用item变量。并在我的控制台我使用lnk?对于那个很抱歉。我删除了将项目的值转换为链接的代码。我更新了代码,谢谢 –

0

您的代码应该是异步的,并且不应该阻塞异步代码。请参阅@Stephen克利的MSDN文章了解更多信息:https://msdn.microsoft.com/en-us/magazine/jj991977.aspx

这里的问题是,你的TestAsync方法开始一个新Task,这将在后台线程执行,并返回任务实际上已经finisihed之前。

你应该让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)); 
} 
相关问题