2017-10-04 39 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) 
{ 
    ... 
}