2017-02-15 62 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)); 
} 
相關問題