我有几个不同的线程来下载一些文件,有两个不同的线程可能想下载同一个文件。文件也可能非常大(> 100MB),所以我想避免两次下载一个文件。
我的想法是同步线程。第一个线程t1
应该下载文件,第二个线程t2
想要下载同一个文件应该等到文件从t1
下载,然后应该从第一个线程通知下载完成。
我的问题是,我有一个未定义的线程数(可能超过1000),它们在整个应用程序的不同位置使用。
我不知道如何在C#中做到这一点。拜托,有人可以给我一些启动思路的东西。
这只是一个描述我的问题的简单例子
答案 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)
{
...
}