线程同步以避免多次下载

时间:2017-10-04 11:37:44

标签: c# multithreading c#-4.0

我有几个不同的线程来下载一些文件,有两个不同的线程可能想下载同一个文件。文件也可能非常大(> 100MB),所以我想避免两次下载一个文件。

我的想法是同步线程。第一个线程t1应该下载文件,第二个线程t2想要下载同一个文件应该等到文件从t1下载,然后应该从第一个线程通知下载完成。

我的问题是,我有一个未定义的线程数(可能超过1000),它们在整个应用程序的不同位置使用。

我不知道如何在C#中做到这一点。拜托,有人可以给我一些启动思路的东西。

这只是一个描述我的问题的简单例子

1 个答案:

答案 0 :(得分: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)
{
    ...
}