管理.net中的异步任务

时间:2015-09-03 01:22:13

标签: c# asynchronous async-await task

我正在创建下载某些文件的程序。我正在测试异步方法,我有问题。我想设置限制一个下载文件的数量。 我有静态方法:

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次,然后应用程序应等待完成任何正在运行的任务并启动新任务。我不想等待所有十项任务,我想在其中一项任务结束后立即启动新任务。我该如何管理任务?在线程中,我能够创建带有线程的旧学校列表,在循环时设置

while(ListOfThreads.Count >=Limit)
{
    for(int i=0;i<ListOfThreads.Count;i++)
    {
        if (ListOfThreads[i].IsCompleted)
        {
            ListOfThreads.RemoveAt(i);
            i--;
        }
    }
}

但是当我尝试对任务程序卡住时也一样,并且从未在StreamToFile中达到input.Dispose()。任务具有WaitingForActivation状态。

当我删除循环时一切正常但当然程序正在下载我粘贴的所有链接

2 个答案:

答案 0 :(得分:1)

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();
  }
}

答案 1 :(得分:0)

我看了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);
}

然后添加课程任务

tasksList.Add(AsyncMethod(parameters));