我正在创建程序来下载一些文件。我正在测试异步方法,我有问题。我想设置下载文件的数量限制。我有一个静态方法:
public static async Task StreamToFile(Stream input, string fileName)
{
if (input != null)
{
string dir = Path.GetDirectoryName(fileName);
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
using (Stream str = File.Create(fileName))
{
await input.CopyToAsync(str);
input.Dispose();
}
}
}
流在外部创建。现在,我想调用这个方法10次,然后应用程序应该等待完成任何一个正在运行的任务,然后开始一个新的。我不想等待所有10个任务,我想在其中一个任务结束后立即开始新的任务。我如何管理任务?在线程中,我能够创建带有线程的旧学校列表,设置while循环
while(ListOfThreads.Count >=Limit)
{
for(int i=0;i<ListOfThreads.Count;i++)
{
if (ListOfThreads[i].IsCompleted)
{
ListOfThreads.RemoveAt(i);
i--;
}
}
}
,但当我尝试做同样的任务程序卡住,从来没有达到输入处置()在StreamToFile。任务状态为WaitingForActivation
当我删除循环时一切正常当然程序会下载我粘贴的所有链接
SemaphoreSlim
可用于限制异步操作:
private static SemaphoreSlim mutex = new SemaphoreSlim(10);
public static async Task StreamToFile(Stream input, string fileName)
{
await mutex.WaitAsync();
try
{
if (input != null)
{
string dir = Path.GetDirectoryName(fileName);
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
using (Stream str = File.Create(fileName))
{
await input.CopyToAsync(str);
input.Dispose();
}
}
}
finally
{
mutex.Release();
}
}
我看了3个小时,但张贴问题后,我找到了解决方案:https://msdn.microsoft.com/pl-pl/library/JJ155756.aspx
我必须创建任务列表
List<Task> tasksList= new List<Task>();
,检查是否达到极限
if(tasksList.Count>=limit)
{
var firstFinished= await Task.WhenAny(tasksList);
tasksList.Remove(firstFinished);
}
then添加course task
tasksList.Add(AsyncMethod(parameters));