2017-10-04 60 views
-2

我有幾個不同的線程來下載一些文件,並且有可能兩個不同的線程想要下載同一個文件。文件也可能非常大(> 100MB),所以我想避免下載一個文件兩次。線程同步以避免多次下載

我的想法是同步線程。第一個線程t1應該下載文件,第二個線程t2要下載相同的文件,應該等到從t1下載文件,然後應該從第一個線程通知下載完成。

我的問題是,我有一個未定義數量的線程(可能超過1000),它們在整個應用程序的不同位置使用。

我不知道如何在C#中做到這一點。任何人都可以給我一些啓動一個想法的東西,請。

這只是一個簡單的例子來說明我的問題

+0

你不明白的問題。如果我使用鎖定,其他線程(下載的其他文件)也將等待。 –

+3

好吧,我會放棄線程並使用任務,而不是你可以使用ConcurrentDictionary來存儲所有活動任務 –

+0

然後確保你有一種檢查已經下載的文件,不要讓它做兩次相同的文件 – BugFinder

回答

0

一個可能的解決方案是使用Task Parallel Library和使用ActionBlock<T>。在那裏,你可以設置MaxDegreeOfParallelism爲1

一個簡單的例子是:

void run() 
{ 
    var actionBlock = new ActionBlock<Uri>(DownloadUri, new 
    ExecutionDataflowBlockOptions(){ MaxDegreeOfParallelism = 1 }); 

    actionBlock.Post(new Uri("http://.....")); 
    actionBlock.Post(new Uri("http://.....")); 
    actionBlock.Post(new Uri("http://.....")); 
    actionBlock.Post(new Uri("http://.....")); 
} 

public Task DownloadUri(Uri uri) 
{ 
    ... 
}